นับการเกิด Char ในสตริง

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 นี้