אלטרנטיבות L-Trim ו- R-Trim בג'אווה

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

השיטה String.trim () מסיר מרחב לבן נגרר ומוביל. אבל, אין תמיכה לעשות סתם L-Trim או R-Trim.

במדריך זה נראה כמה דרכים שנוכל ליישם זאת; בסופו של דבר נשווה את הביצועים שלהם.

2. בזמן לוּלָאָה

הפתרון הפשוט ביותר הוא לעבור על המחרוזת באמצעות מספר בזמן לולאות.

עבור L-Trim נקרא את המחרוזת משמאל לימין עד שנתקל בתו שאינו לבן.

int i = 0; בעוד (i <s.length () && Character.isWhitespace (s.charAt (i))) {i ++; } מחרוזת ltrim = s.substring (i); 

ltrim הוא אז תשתית שמתחילה בתו הראשון שאינו לבן.

או עבור R-Trim, נקרא את המחרוזת שלנו מימין לשמאל עד שנתקל בתו שאינו לבן.

int i = s.length () - 1; בעוד (i> = 0 && Character.isWhitepace (s.charAt (i))) {i--; } מחרוזת rtrim = s.substring (0, i + 1);

rtrim הוא אז סובסטרינג שמתחיל בהתחלה ומסתיים בתו הראשון שאינו לבן.

3. String.replaceAll שימוש בביטויים רגולריים

אפשרות נוספת היא להשתמש String.replaceAll () וביטוי קבוע:

מחרוזת ltrim = src.replaceAll ("^ \ s +", ""); מחרוזת rtrim = src.replaceAll ("\ s + $", "");

(\ s +) הוא ה- regex המתאים לתו אחד או רבים של תווים לבנים. הקרטה (^) ו- ($) בתחילת ובסוף הביטוי הרגולרי תואמים את ההתחלה והסוף של שורה.

4. Pattern.compile () ו .matcher ()

אנחנו יכולים לעשות שימוש חוזר בביטויים קבועים עם java.util.regex.Patternגם:

תבנית סטטית פרטית LTRIM = Pattern.compile ("^ \ s +"); תבנית סטטית פרטית RTRIM = Pattern.compile ("\ s + $"); מחרוזת ltrim = LTRIM.matcher (ים) .replaceAll (""); מחרוזת rtim = RTRIM.matcher (s) .replaceAll ("");

5. אפאצ'י קומונס

בנוסף, אנו יכולים לנצל את Apache Commons StringUtils # stripStart ו #stripEnd שיטות להסרת מרחב לבן.

לשם כך, ראשית נוסיף את commons-lang3 תלות:

 org.apache.commons commons-lang3 3.8.1 

בעקבות התיעוד, אנו משתמשים ריק על מנת להפשיט את החלל הלבן:

מחרוזת ltrim = StringUtils.stripStart (src, null); מחרוזת rtrim = StringUtils.stripEnd (src, null);

6. גויאבה

לבסוף ננצל את גויאבה CharMatcher # trimLeadingFrom ו #trimTrailingFrom שיטות להשגת אותה תוצאה.

שוב, בואו נוסיף את התלות המתאימה של Maven, הפעם שלה גויאבה:

 com.google.guava גויאבה 28.2-jre 

ובגויאבה, זה די דומה לאופן שבו זה נעשה באפצ'י קומונס, רק בשיטות ממוקדות יותר:

מחרוזת ltrim = CharMatcher.whitespace (). TrimLeadingFrom (s); מחרוזת rtrim = CharMatcher.whitespace (). TrimTrailingFrom (ים);

7. השוואת ביצועים

בואו נראה את ביצועי השיטות. כרגיל, נשתמש במסגרת הקוד הפתוח Java Microbenchmark Harness (JMH) כדי להשוות בין החלופות השונות בננו שניות.

7.1. הגדרת מידוד

לצורך התצורה הראשונית של אמת המידה, השתמשנו בחמישה מזלגות ובזמן חישוב ממוצע בננו שניות:

@Fork (5) @State (Scope.Benchmark) @BenchmarkMode (Mode.AverageTime) @OutputTimeUnit (TimeUnit.NANOSECONDS)

בשיטת ההתקנה, אנו מאתחלים את שדה ההודעה המקורי ואת המחרוזת המתקבלת להשוואה עם:

@ הגדרת הגדרת חלל ציבורי () {src = "רווחים לבנים מימין ומשמאל"; ltrimResult = "רווחים לבנים שמאלה וימינה"; rtrimResult = "רווחים לבנים שמאלה וימינה"; }

ראשית כל הסמלים מסירים את המרחב הלבן השמאלי, ואז מסירים את החלל הימני ולבסוף משווים את התוצאות למחרוזות הצפויות שלהם.

7.2. בזמן לוּלָאָה

עבור המדד הראשון שלנו, בואו נשתמש ב- בזמן גישת לולאה:

@Benchmark ציבורי בוליאני whileCharacters () {מחרוזת ltrim = whileLtrim (src); מחרוזת rtrim = whileRtrim (src); החזר checkStrings (ltrim, rtrim); }

7.3. String.replaceAll () עם ביטוי רגיל

ואז, בוא ננסה String.replaceAll ():

@Benchmark להחליף בוליאני ציבורי ציבורית AllRegularExpression () {String ltrim = src.replaceAll ("^ \ s +", ""); מחרוזת rtrim = src.replaceAll ("\ s + $", ""); החזר checkStrings (ltrim, rtrim); }

7.4. תבנית. Compile (). התאמות ()

אחרי זה מגיע תבנית. Compile (). התאמות ():

@Benchmark דפוס בוליאני ציבורי MatchesLTtrimRTrim () {String ltrim = patternLtrim (src); מחרוזת rtrim = patternRtrim (src); החזר checkStrings (ltrim, rtrim); }

7.5. אפאצ'י קומונס

רביעית, Apache Commons:

@Benchmark apacheCoolonsStoolUtils ציבוריים בוליאניים () {String ltrim = StringUtils.stripStart (src, ""); מחרוזת rtrim = StringUtils.stripEnd (src, ""); החזר checkStrings (ltrim, rtrim); }

7.6. גויאבה

ולסיום, בואו נשתמש בגויאבה:

@Benchmark בוליאני ציבורי guavaCharMatcher () {String ltrim = CharMatcher.whitespace (). TrimLeadingFrom (src); מחרוזת rtrim = CharMatcher.whitespace (). TrimTrailingFrom (src); החזר checkStrings (ltrim, rtrim); }

7.7. ניתוח התוצאות

ועלינו לקבל כמה תוצאות הדומות לתוצאות הבאות:

# הפעל הושלם. זמן כולל: 00:16:57 יחידות מידה Cnt ציון שגיאות יחידות LTrimRTrim.apacheCommonsStringUtils avgt 100 108,718 ± 4,503 ns / op LTrimRTrim.guavaCharMatcher avgt 100 113,601 ± 5,563 ns / op LTrimRTrim.patternMatchesLTtrimR85 טרימטר avgt 100 1046,660 ± 7,151 ns / op LTrimRTrim. whileCharacters avgt 100 110,379 ± 1,032 ns / op

וזה נראה כאילו הזוכים שלנו הם בזמן לולאה, אפאצ'י קומונס וגויאבה!

8. מסקנה

במדריך זה בדקנו כמה דרכים שונות להסרת תווים רווחים בהתחלה ובסוף של חוּט.

השתמשנו בזמן לוּלָאָה, String.replaceAll (),Pattern.matcher (). להחליף את כל (), Apache Commons ו- Guava כדי להשיג תוצאה זו.

כמו תמיד, הקוד זמין ב- GitHub.