מיון מחרוזות לפי מספרים מכילים בג'אווה

1. הקדמה

במדריך זה נבדוק כיצד למיין אלפאנומריים חוּטs לפי המספרים שהם מכילים. אנו נתמקד בהסרת כל התווים הלא-מספריים מה- חוּט לפני מיון מרובים מיתרים לפי התווים המספריים שנותרו.

אנו נסתכל על מקרי קצה נפוצים, כולל ריק חוּטs ומספרים לא חוקיים.

לבסוף, נבדוק יחידה את הפתרון שלנו כדי להבטיח שהוא עובד כצפוי.

2. מתווה הבעיה

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

  1. המיתרים שלנו עשויים להכיל רק מספרים, רק אותיות או שילוב של השניים.
  2. המספרים במיתרים שלנו עשויים להיות מספרים שלמים או כפולים.
  3. כאשר מספרים במחרוזת מופרדים באותיות, עלינו להסיר את האות ולעבות את הספרות יחד. לדוגמה, 2d3 הופך להיות 23.
  4. למען הפשטות, כאשר מופיע מספר לא חוקי או חסר, עלינו להתייחס אליהם כאל 0.

עם קביעת זה, בואו נתקע בפתרון שלנו.

3. פתרון של Regex

מאז הצעד הראשון שלנו הוא לחפש תבניות מספריות בקלט שלנו חוּט, אנו יכולים להשתמש בביטויים רגולריים, המכונים בדרך כלל רגקס.

הדבר הראשון שאנחנו צריכים זה ה- regex שלנו. אנו רוצים לשמור על כל המספרים השלמים וכן על נקודות עשרוניות מהקלט חוּט. אנו יכולים להשיג את מטרתנו באמצעות הדברים הבאים:

מחרוזת DIGIT_AND_DECIMAL_REGEX = "[^ \ ד.]" מחרוזת ספרות בלבד = input.replaceAll (DIGIT_AND_DECIMAL_REGEX, "");

בואו נסביר בקצרה מה קורה:

  1. ‘[^ ]' - מציין סט שלילי, ולכן מכוון לכל תו שלא צוין על ידי ה- regex הסגור
  2. '\ D' - להתאים לכל תו ספרתי (0 - 9)
  3. ‘.' - התאם לכל "." אופי

לאחר מכן אנו משתמשים String.replaceAll שיטה להסרת כל התווים שלא צוינו על ידי ה- regex שלנו. על ידי כך, אנו יכולים להבטיח כי ניתן להשיג את שלוש הנקודות הראשונות של מטרתנו.

לאחר מכן, עלינו להוסיף כמה תנאים כדי להבטיח ריק ולא חוקי מיתרים החזר 0, בעודו תקף מיתרים להחזיר תקף לְהַכפִּיל:

אם ("". שווה (ספרות בלבד)) להחזיר 0; נסה {להחזיר Double.parseDouble (ספרות בלבד); } לתפוס (NumberFormatException nfe) {להחזיר 0; }

זה משלים את ההיגיון שלנו. כל שנותר לעשות הוא לחבר אותו למשווה כך שנוכל למיין בצורה נוחה רשימות של קלט מיתרים.

בואו ניצור שיטה יעילה להחזרת המשווה שלנו מכל מקום שנרצה בכך:

Comparator static public createNaturalOrderRegexComparator () {return Comparator.comparingDouble (NaturalOrderComparators :: parseStringToNumber); }

4. טסט, טסט, טסט

מה טוב קוד ללא בדיקות כדי לאמת את הפונקציונליות שלו? בואו נקבע בדיקת יחידה מהירה כדי להבטיח שהכל יפעל כמתוכנן:

רשימה testStrings = Arrays.asList ("a1", "d2.2", "b3", "d2.3.3d", "c4", "d2.f4",); // 1, 2.2, 3, 0, 4, 2.4 testStrings.sort (NaturalOrderComparators.createNaturalOrderRegexComparator ()); רשימה צפויה = Arrays.asList ("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4"); assertEquals (צפוי, testStrings);

במבחן היחידה ארזנו את כל התרחישים שתכננו להם. מספרים, מספרים שלמים, עשרוניים ומספרים המופרדים באותיות לא חוקיים הכלולים במספר שלנו testStrings מִשְׁתַנֶה.

5. מסקנה

במאמר קצר זה הדגמנו כיצד למיין מחרוזות אלפאנומריות על סמך המספרים בתוכם - תוך שימוש בביטויים רגולריים כדי לעשות את העבודה הקשה עבורנו.

טיפלנו בחריגים סטנדרטיים שעשויים להתרחש בעת ניתוח מחרוזות קלט ובדקנו את התרחישים השונים באמצעות בדיקת יחידות.

כמו תמיד, ניתן למצוא את הקוד ב- GitHub.


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