JavaRush /בלוג Java /Random-HE /כיתת סורק ב-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()ניגשת למקור הנתונים (הטקסט שלנו עם ריבועים), מוצאת שם את השורה הבאה שעדיין לא קראה (במקרה שלנו, הראשונה) ומחזירה אותה. לאחר מכן נוציא אותו לקונסולה: פלט מסוף:

Люблю тебя, 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
אופס, הכל רע -_- כדי להימנע ממצבים כאלה, אנחנו צריכים למצוא דרך לאמת את הנתונים שהמשתמש מזין. לדוגמה, המשתמש מזין כל דבר מלבד מספר, יהיה נחמד להציג אזהרה בקונסולה שהמידע שהוזן אינו מספר, ואם הכל תקין, להציג טקסט אישור. אבל כדי לעשות זאת, אנחנו למעשה צריכים "להסתכל אל העתיד" - לגלות מה הלאה בזרימה שלנו. האם סורק ב-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!");
       }

   }
}
כעת התוכנית שלנו בודקת אם התו הבא שהוזן הוא מספר או לא. ורק אם כן, הוא מציג אישור. אם הקלט לא עובר את המבחן, התוכנית שמה לב לכך ומבקשת ממך לנסות שוב. בעיקרון, אתה יכול לתקשר עם אובייקט הסורק ולדעת מראש לאיזה סוג נתונים לצפות. "היי, סורק, מה הלאה? מספר, מחרוזת או משהו אחר? מספר? ואיזה מהם - int, short, long?" גמישות זו נותנת לך את ההזדמנות לבנות את ההיגיון של התוכנית שלך בהתאם להתנהגות המשתמש. שיטה חשובה נוספת שכדאי לשים אליה לב היא useDelimiter(). שיטה זו מועברת למחרוזת שבה ברצונך להשתמש כמפריד. למשל, פתאום התחלנו להתעניין בשירה היפנית והחלטנו להשתמש בסורק כדי לקרוא כמה הייקו של המשורר הגדול Matsuo Basho. גם אם ניתנו לנו שלושה פסוקים שונים בשורה אחת מגושמת, נוכל בקלות להפריד ביניהם ולעצב אותם יפה:
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(). כמו כל אובייקט שעובד עם זרמי קלט/פלט, יש לסגור את הסורק עם השלמת עבודתו, כך שהוא לא יצרוך עוד את משאבי המחשב שלנו. לעולם אל תשכח את השיטה 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!

   }
}
זה הכל! כפי שאתה יכול לראות, כיתת הסורק די קלה לשימוש ושימושית מאוד! :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION