1. ภาพรวม
มีหลายวิธีในการนับจำนวนครั้งที่เกิดขึ้นของอักขระในสตริงใน Java
ในบทความสั้น ๆ นี้เราจะเน้นไปที่ตัวอย่างบางส่วนของวิธีการนับอักขระอันดับแรกด้วยไลบรารี Java หลักจากนั้นจึงรวมไลบรารีและเฟรมเวิร์กอื่น ๆ เช่น Spring และ Guava
2. การใช้ Core Java Lib
2 .1. แนวทางที่จำเป็น
นักพัฒนาบางคนอาจต้องการใช้ Java หลัก มีหลายวิธีในการนับจำนวนครั้งที่เกิดขึ้นของอักขระในสตริง
เริ่มต้นด้วยวิธีง่ายๆ / ไร้เดียงสา:
String someString = "elephant"; char someChar = 'e'; int count = 0; for (int i = 0; i < someString.length(); i++) { if (someString.charAt(i) == someChar) { count++; } } assertEquals(2, count);
ไม่น่าแปลกใจที่สิ่งนี้จะได้ผล แต่ก็ไม่น่าแปลกใจที่มีวิธีที่ดีกว่านี้
2.2. การใช้การเรียกซ้ำ
วิธีแก้ปัญหาที่ชัดเจนน้อยกว่า แต่ก็ยังน่าสนใจคือการใช้การเรียกซ้ำ:
private static int countOccurences( String someString, char searchedChar, int index) { if (index >= someString.length()) { return 0; } int count = someString.charAt(index) == searchedChar ? 1 : 0; return count + countOccurences( someString, searchedChar, index + 1); }
เราสามารถเรียกใช้วิธีการเรียกซ้ำได้ด้วยวิธีต่อไปนี้: useRecursionToCountChars (“ elephant”, 'e', 0)
2.4. การใช้นิพจน์ทั่วไป
อีกวิธีหนึ่งคือการใช้นิพจน์ทั่วไป:
Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) { count++; } assertEquals(2, count);
โปรดทราบว่าโซลูชันนี้ถูกต้องในทางเทคนิค แต่ไม่เหมาะสมเนื่องจากเป็นการใช้นิพจน์ทั่วไปที่มีประสิทธิภาพมากเกินไปเพื่อแก้ปัญหาง่ายๆเช่นการหาจำนวนอักขระที่เกิดขึ้นในสตริง
2.5. การใช้คุณสมบัติ Java 8
คุณสมบัติใหม่ที่มีใน Java 8 จะมีประโยชน์มากที่นี่
มาใช้สตรีมและแลมบ์ดาในการนับ:
String someString = "elephant"; long count = someString.chars().filter(ch -> ch == 'e').count(); assertEquals(2, count); long count2 = someString.codePoints().filter(ch -> ch == 'e').count(); assertEquals(2, count2);
ดังนั้นนี่เป็นวิธีแก้ปัญหาที่สะอาดและอ่านง่ายขึ้นโดยใช้ไลบรารีหลัก
3. การใช้ห้องสมุดภายนอก
ตอนนี้มาดูวิธีแก้ปัญหาบางอย่างที่ใช้ประโยชน์จากยูทิลิตี้จากไลบรารีภายนอก
3.1. ใช้StringUtils
โดยทั่วไปแล้วการใช้โซลูชันที่มีอยู่แทนที่จะประดิษฐ์ขึ้นเองจะดีกว่าเสมอ commons.lang.StringUtilsระดับให้เรามีcountMatches ()วิธีการที่สามารถนำมาใช้สำหรับการนับตัวอักษรหรือแม้กระทั่งย่อยสตริงในกำหนดสตริง
อันดับแรกเราต้องรวมการอ้างอิงที่เหมาะสม:
org.apache.commons commons-lang3 3.5
เราสามารถค้นหาเวอร์ชันล่าสุดได้ที่ Maven Central
ตอนนี้เรามาใช้countMatches ()เพื่อนับจำนวนอักขระ "e" ในสตริงลิเทอรัล "elephant":
int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);
3.2. ใช้ฝรั่ง
ฝรั่งยังมีประโยชน์ในการนับตัวอักษร เราจำเป็นต้องกำหนดการพึ่งพา:
com.google.guava guava 21.0
เราสามารถค้นหาเวอร์ชันล่าสุดได้ที่ Maven Central
มาดูกันว่า Guava สามารถช่วยเรานับตัวอักษรได้อย่างไร:
int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);
3.3. ใช้สปริง
การเพิ่ม Spring Framework เข้าไปในโปรเจ็กต์ของคุณโดยธรรมชาติเพียงเพื่อนับตัวอักษรนั้นไม่สมเหตุสมผล อย่างไรก็ตามหากเรามีอยู่แล้วในโครงการของเราเราก็ต้องใช้เมธอด countOccurencesOf () :
int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);
4. สรุป
ในบทช่วยสอนฉบับย่อนี้เรามุ่งเน้นไปที่วิธีต่างๆในการนับตัวอักษรใน String บางส่วนได้รับการออกแบบโดยเฉพาะใน Java บางไลบรารีเพิ่มเติมที่จำเป็น
คำแนะนำของเราคือการใช้ยูทิลิตี้ที่มีอยู่แล้วจากStringUtils , Guava หรือ Spring อย่างไรก็ตามหากใครต้องการใช้เฉพาะ Java ธรรมดาบทความนี้เสนอความเป็นไปได้บางอย่างในการทำสิ่งนั้นให้สำเร็จด้วย Java 8
ซอร์สโค้ดที่สมบูรณ์สำหรับตัวอย่างเหล่านี้มีอยู่ในโปรเจ็กต์ GitHub นี้