JavaRush /จาวาบล็อก /Random-TH /คลาสสแกนเนอร์ใน Java

คลาสสแกนเนอร์ใน Java

เผยแพร่ในกลุ่ม
สวัสดี! บทเรียนของเราวันนี้จะพิเศษ! ก่อนหน้านี้ เมื่อแก้ไขปัญหาและเขียนโปรแกรม อัลกอริธึมนั้นง่าย: เราเขียนโค้ด รันเมธอดmain()โปรแกรมจะทำสิ่งที่จำเป็น และออก แต่ตอนนี้ทุกอย่างจะเปลี่ยนไป! วันนี้เราจะได้เรียนรู้วิธีโต้ตอบกับโปรแกรมอย่างแท้จริง: เราจะสอนให้ตอบสนองต่อการกระทำของเรา! คุณอาจเข้าใจแล้วว่าเราจะดำเนินการเรื่องนี้อย่างไร เราจะอุทิศการบรรยายนี้ให้กับการวิเคราะห์โดยละเอียดของคลาสภาษา Java คลาสใดคลาสหนึ่ง – Scanner คลาสนี้จะมีประโยชน์หากคุณต้องการอ่านข้อมูลที่ผู้ใช้ป้อน ก่อนที่เราจะเรียนรู้โค้ดต่อไป บอกฉันหน่อย คุณเคยเจออุปกรณ์เช่นสแกนเนอร์บ้างไหม? ใช่แน่นอน โครงสร้างภายในของเครื่องสแกนค่อนข้างซับซ้อน แต่สาระสำคัญของงานนั้นค่อนข้างง่าย: อ่านข้อมูลที่ผู้ใช้ป้อนเข้าไป (เช่นหนังสือเดินทางหรือกรมธรรม์ประกันภัย) และจัดเก็บข้อมูลที่อ่านไว้ในหน่วยความจำ (เช่น ในรูปแบบของภาพ) ดังนั้นวันนี้คุณจะสร้างเครื่องสแกนของคุณเอง! แน่นอนว่าเขาจัดการเอกสารไม่ได้ แต่เขาจัดการข้อมูลข้อความได้ค่อนข้างดี :) ลุยเลย!คลาสสแกนเนอร์ - 1

คลาสสแกนเนอร์ Java

สิ่งแรกและสำคัญที่สุดที่เราต้องทำความคุ้นเคยคือชั้นjava.util.Scannerเรียน ฟังก์ชั่นของมันง่ายมาก เช่นเดียวกับเครื่องสแกนจริง มันจะอ่านข้อมูลจากแหล่งที่คุณระบุ ตัวอย่างเช่น จากบรรทัด จากไฟล์ จากคอนโซล จากนั้นระบบจะจดจำข้อมูลนี้และประมวลผลตามความจำเป็น ลองยกตัวอย่างที่ง่ายที่สุด:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
เราสร้างออบเจ็กต์เครื่องสแกนและระบุแหล่งข้อมูลสำหรับวัตถุนั้น (สตริงพร้อมข้อความ) วิธีการnextLine()เข้าถึงแหล่งข้อมูล (ข้อความของเราที่มี quatrains) ค้นหาบรรทัดถัดไปที่ยังไม่ได้อ่าน (ในกรณีของเราคือบรรทัดแรก) และส่งคืน หลังจากนั้นเราจะส่งออกไปยังคอนโซล: เอาต์พุตคอนโซล:

Люблю тебя, Peterа творенье,
เราสามารถใช้วิธีนี้nextLine()ได้หลายครั้งและส่งออกบทกวีทั้งหมด:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
แต่ละครั้งเครื่องสแกนของเราจะก้าวไปข้างหน้าหนึ่งก้าวและอ่านบรรทัดถัดไป ผลลัพธ์ของโปรแกรมจะถูกส่งออกไปยังคอนโซล:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
ดังที่เราได้กล่าวไปแล้ว แหล่งข้อมูลสำหรับเครื่องสแกนไม่เพียงแต่เป็นสตริงเท่านั้น แต่ยังรวมถึงคอนโซลด้วย ข่าวสำคัญสำหรับเรา: หากก่อนหน้านี้เราส่งออกเฉพาะข้อมูลที่นั่น ตอนนี้เราจะป้อนข้อมูลจากแป้นพิมพ์! มาดูกันว่า คลาส Scanner สามารถทำอะไรได้อีก :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
วิธีการnextInt()อ่านและส่งกลับตัวเลขที่ป้อน numberในโปรแกรมของ เราใช้สำหรับกำหนดค่าให้กับตัวแปร ดูเหมือนสแกนเนอร์จริงมากกว่า! โปรแกรมขอให้ผู้ใช้ป้อนหมายเลขใด ๆ ลงในบรรทัด หลังจากที่ผู้ใช้ทำสิ่งนี้เสร็จแล้ว โปรแกรมจะขอบคุณเขา แสดงผลการทำงานบนคอนโซลและสิ้นสุด แต่เรายังคงมีปัญหาร้ายแรงอย่างหนึ่ง ผู้ใช้อาจทำผิดพลาดและป้อนข้อมูลผิด นี่คือตัวอย่างเมื่อโปรแกรมปัจจุบันของเราหยุดทำงาน:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
ลองป้อนสตริง “JavaRush” แทนตัวเลข: เอาต์พุตคอนโซล:
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:864)
  at java.util.Scanner.next(Scanner.java:1485)
  at java.util.Scanner.nextInt(Scanner.java:2117)
  at java.util.Scanner.nextInt(Scanner.java:2076)
  at Main.main(Main.java:10)

Process finished with exit code 1
อ๊ะ ทุกอย่างแย่ไปหมด -_- เพื่อหลีกเลี่ยงสถานการณ์เช่นนี้ เราจึงต้องหาวิธีตรวจสอบข้อมูลที่ผู้ใช้ป้อน ตัวอย่างเช่น ผู้ใช้ป้อนสิ่งอื่นที่ไม่ใช่ตัวเลข เป็นการดีที่จะแสดงคำเตือนในคอนโซลว่าข้อมูลที่ป้อนไม่ใช่ตัวเลข และหากทุกอย่างเป็นไปตามลำดับ ให้แสดงข้อความยืนยัน แต่การจะทำสิ่งนี้ได้ จริงๆ แล้วเราต้อง "มองไปสู่อนาคต" - ค้นหาว่าอะไรจะเกิดขึ้นต่อไปในโฟลว์ของเรา Scanner ใน Java สามารถทำเช่นนี้ได้หรือไม่? เขาทำได้ยังไง! และสำหรับสิ่งนี้ มันมีวิธีการทั้งหมด: hasNextInt()- วิธีการตรวจสอบว่าส่วนถัดไปของข้อมูลที่ป้อนเป็นตัวเลขหรือไม่ (คืนค่าจริงหรือเท็จตามลำดับ) hasNextLine()— ตรวจสอบว่าข้อมูลชิ้นถัดไปเป็นสตริงหรือไม่ hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- วิธีการทั้งหมดนี้ทำแบบเดียวกันกับข้อมูลประเภทอื่น ลองเปลี่ยนโปรแกรมของเราเพื่ออ่านตัวเลข:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thank you! You entered a number" + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
ตอนนี้โปรแกรมของเราจะตรวจสอบว่าอักขระถัดไปที่ป้อนเป็นตัวเลขหรือไม่ และหากเป็นเช่นนั้นเท่านั้น ระบบจะแสดงการยืนยัน หากอินพุตไม่ผ่านการทดสอบ โปรแกรมจะสังเกตเห็นและขอให้คุณลองอีกครั้ง โดยพื้นฐานแล้ว คุณสามารถสื่อสารกับออบเจ็กต์ Scanner และ ทราบ ล่วงหน้าว่าควรคาดหวังข้อมูลประเภทใด “เฮ้ สแกนเนอร์ อะไรต่อไป? ตัวเลข สตริง หรืออย่างอื่น? ตัวเลข? แล้วอันไหน - int, short, long?” ความยืดหยุ่นนี้เปิดโอกาสให้คุณสร้างตรรกะของโปรแกรมของคุณโดยขึ้นอยู่กับพฤติกรรมของผู้ใช้ อีกวิธีสำคัญที่ควรค่าแก่การเอาใจใส่useDelimiter()คือ วิธีการนี้จะถูกส่งผ่านสตริงที่คุณต้องการใช้เป็นตัวคั่น ตัวอย่างเช่น จู่ๆ เราก็เริ่มสนใจบทกวีของญี่ปุ่น และตัดสินใจใช้เครื่องสแกนเพื่ออ่านไฮกุหลายบทของนักกวีผู้ยิ่งใหญ่ มัตสึโอะ บาโช แม้ว่าเราจะให้ข้อพระคัมภีร์ที่แตกต่างกันสามข้อในบรรทัดเดียวที่งุ่มง่าม แต่เราก็สามารถแยกข้อเหล่านั้นและจัดรูปแบบไว้อย่างสวยงามได้อย่างง่ายดาย:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
เราใช้เมธอด useDelimeter() ของ คลาสScanner เป็นตัวคั่นบรรทัดโดยมีหน้าที่แบ่งข้อมูลขาเข้าออกเป็นส่วนๆ ในกรณีของเรา เครื่องหมายคำ พูด เดี่ยว ( "'" ) จะถูกส่งผ่านเป็นอาร์กิวเมนต์และใช้เพื่อแยกสตริง ข้อความที่ตามเครื่องหมายคำพูดนี้จะปรากฏบนบรรทัดใหม่ เนื่องจากในลูป while เราใช้ เมธอด println() ของ คลาสSystemเพื่ออ่านข้อมูล ด้วยเหตุนี้ เราจะได้ผลลัพธ์ที่สวยงามในคอนโซล เช่นเดียวกับในหนังสือ:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
ในตัวอย่างเดียวกัน มีอีกวิธีหนึ่งที่คุณควรใส่ใจอย่างแน่นอนclose()- เช่นเดียวกับออบเจ็กต์อื่นๆ ที่ทำงานร่วมกับสตรีม I/O สแกนเนอร์ควรปิดเมื่อทำงานเสร็จแล้ว เพื่อไม่ให้สิ้นเปลืองทรัพยากรของคอมพิวเตอร์ของเราอีกต่อไป อย่าลืมวิธีการclose()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
นั่นคือทั้งหมด! อย่างที่คุณเห็นคลาส Scanner นั้นค่อนข้างใช้งานง่ายและมีประโยชน์มาก! :)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION