Java Scanner hasNext () לעומת hasNextLine ()

1. סקירה כללית

ה סוֹרֵק class הוא כלי שימושי שיכול לנתח סוגים ומחרוזות פרימיטיביים באמצעות ביטויים רגולריים והוכנס ל java.util חבילה בג'אווה 5.

במדריך קצר זה נדבר עליו hasNext () ו hasNextLine () שיטות. למרות ששתי השיטות הללו עשויות להיראות די דומות בהתחלה, הן למעשה עושות בדיקות שונות לגמרי.

תוכל גם לקרוא עוד על שיעור הסורקים הרב-תכליתי במדריך המהיר כאן.

2. hasNext ()

2.1. שימוש בסיסי

HasNext () השיטה בודקת אם סוֹרֵק יש אסימון נוסף בקלט שלו. א סוֹרֵק מפרק את הקלט שלו לאסימונים באמצעות תבנית מפריד, שתואמת כברירת מחדל לרווח לבן. זה, hasNext () בודק את הקלט ומחזיר נָכוֹן אם יש לו אופי אחר שאינו לבן.

עלינו לציין גם כמה פרטים אודות מפריד ברירת המחדל:

  • מרחב לבן כולל לא רק את תו החלל, אלא גם שטח כרטיסיות (\ t), הזנת שורה (\ n), ואפילו יותר תווים
  • מתייחסים לדמויות רציפות לבנות כמפריד יחיד
  • השורות הריקות בסוף הקלט אינן מודפסות - כלומר, hasNext () החזרות שֶׁקֶר לשורות ריקות

בואו נסתכל על דוגמה כיצד hasNext () עובד עם מפריד ברירת המחדל. ראשית, נכין מחרוזת קלט שתעזור לנו לחקור את Sשימוריםתוצאת הניתוח:

מחרוזת INPUT = חדש StringBuilder () .append ("קסם \ tproject \ n") .append ("מסד נתונים: אורקל \ n") .append ("תלות: \ n") .append ("קפיץ: foo: bar \ n ") .append (" \ n ") // שים לב שהקלט מסתיים בשורה ריקה .toString ();

לאחר מכן, בואו לנתח את הקלט ולהדפיס את התוצאה:

סורק סורק = סורק חדש (INPUT); בעוד (scanner.hasNext ()) {log.info (scanner.next ()); } log.info ("-------- OUTPUT - END ---------") 

אם נפעיל את הקוד לעיל, נראה את פלט המסוף:

פרויקט [DEMO] קסם [DEMO] [DEMO] מסד נתונים: [DEMO] אורקל [DEMO] תלות: [DEMO] קפיץ: foo: סרגל [DEMO] -------- פלט - סיום ----- ---- 

2.2. עם מפריד מותאם אישית

עד כה הסתכלנו hasNext () עם מפריד ברירת המחדל. ה סוֹרֵק מעמד מספק useDelimiter (תבנית מחרוזת) שיטה שמאפשר לנו לשנות את המפריד. לאחר שינוי המתח, ה- hasNext () השיטה תעשה את הבדיקה עם המפריד החדש במקום ברירת המחדל.

בואו נראה דוגמה נוספת לאיך hasNext () ו הַבָּא() לעבוד עם תיחום מותאם אישית. נשתמש שוב בקלט מהדוגמה האחרונה.

לאחר שהסורק מנתח אסימון התואם למחרוזת "תלות:", נשנה את המפריד למעי הגס ( : ) כדי שנוכל לנתח ולחלץ כל ערך מהתלות:

בעוד (scanner.hasNext ()) {אסימון מחרוזת = scanner.next (); if ("תלות:". שווה (אסימון)) {scanner.useDelimiter (":"); } log.info (אסימון); } log.info ("-------- OUTPUT - END ---------");

בואו נראה את הפלט המתקבל:

[DEMO] קסם [DEMO] פרוייקט [DEMO] מסד נתונים: [DEMO] אורקל [DEMO] תלות: [DEMO] קפיץ [DEMO] foo [DEMO] סרגל [DEMO] -------- OUTPUT - END- --------

גדול! חילצנו בהצלחה את הערכים בסעיף "תלות"עם זאת, יש כאלה בעיות בלתי צפויות של פריצת קו. נראה כיצד להימנע מאלה בסעיף הבא.

2.3. עם regex כמפריד

בואו נסקור את התפוקה בחלק האחרון. ראשית, שמנו לב שיש מעבר שורה (\ n) לפני "אביב". שינינו את המפריד ל"לא:" לאחר "תלות:" אסימון הושג. הפסקה בתור אחרי "תלות:הופך כעת לחלק מהאסימון הבא. לָכֵן, hasNext () חזר נָכוֹן והפסקת השורות הודפסה.

מאותה סיבה, הזנת השורה אחרי "שינה"והשורה הריקה האחרונה הופכת לחלק מהאסימון האחרון, ולכן שתי שורות ריקות מודפסות יחד עם"שינה“.

אם נוכל להפוך גם את המעי הגס וגם את המרחב הלבן למפריד, ערכי ה"תלות "ינותחו כראוי והבעיה שלנו תיפתר. כדי להשיג זאת, בואו נשנה את useDelimiter (“:”) שִׂיחָה:

scanner.useDelimiter (": | \ s +"); 

ה ": | \ s +"הנה ביטוי רגיל התואם לתו יחיד:" או תו אחד או יותר. עם תיקון זה, הפלט הופך ל:

[DEMO] קסם [DEMO] פרויקט [DEMO] מסד נתונים: [DEMO] אורקל [DEMO] תלות: [DEMO] קפיץ [DEMO] foo [DEMO] סרגל [DEMO] -------- OUTPUT - END- --------

3. hasNextLine ()

ה hasNextLine () השיטה בודקת אם יש עוד שורה בקלט של סוֹרֵק אובייקט, לא משנה אם הקו ריק או לא.

בוא ניקח את אותה קלט שוב. הפעם נוסיף מספרי שורה לפני כל שורה בקלט באמצעות hasNextLine () ו nextLine () שיטות:

int i = 0; בעוד (scanner.hasNextLine ()) log.info (String.format ("% d log.info (" -------- OUTPUT - END --------- ");

עכשיו, בואו נסתכל על התפוקה שלנו:

[DEMO] 1 | פרויקט קסמים [DEMO] 2 | מסד נתונים: אורקל [DEMO] 3 | תלות: [DEMO] 4 | קפיץ: foo: bar [DEMO] 5 | [DEMO] -------- OUTPUT - END ---------

כפי שציפינו, מספרי השורות מודפסים וגם השורה הריקה האחרונה קיימת.

4. מסקנה

במאמר זה למדנו זאת סוֹרֵקשל hasNextLine () שיטה בודקת אם יש שורה נוספת בקלט, לא משנה אם השורה ריקה או לא, בעוד hasNext () משתמש במפריד כדי לבדוק אם יש אסימון אחר.

כמו תמיד, קוד המקור המלא לדוגמאות זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found