문자열에서 Char 발생 횟수 계산
1. String에서 char의 발생 횟수 계산
Java의 String에서 char의 발생 횟수를 계산하는 방법에는 여러 가지가 있다.
먼저 핵심 Java 라이브러리를 사용한 다음 Spring 및 Guava와 같은 다른 라이브러리 및 프레임워크를 사용하여 문자 수를 계산하는 방법에 대한 몇 가지 예에 중점을 둔다.
2. 코어 자바 라이브러리 사용
1) 명령적 접근
일부 개발자는 코어 Java를 사용하는 것을 선호할 수 있다. 문자열에서 char의 발생 횟수를 계산하는 방법에는 여러 가지가 있다.
1
2
3
4
5
6
7
8
9
10
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) 재귀 사용
덜 분명하지만 흥미로운 솔루션은 재귀를 사용하는 것이다.
1
2
3
4
5
6
7
8
9
10
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)
3) 정규식 사용
또 다른 방법은 정규식을 사용하는 것이다.
1
2
3
4
5
6
7
8
Pattern pattern = Pattern.compile("[^e]*e");
Matcher matcher = pattern.matcher("elephant");
int count = 0;
while (matcher.find()) {
count++;
}
assertEquals(2, count);
이 솔루션은 기술적으로 정확하지만 차선책이다. 문자열에서 문자의 발생 횟수를 찾는 것과 같은 간단한 문제를 해결하기 위해 매우 강력한 정규식을 사용하는 것은 과도하기 때문이다.
4) Java 8 기능 사용
Java 8에서 사용할 수 있는 새로운 기능은 여기에서 매우 유용할 수 있다.
스트림과 람다를 사용하여 개수를 구현한다.
1
2
3
4
5
6
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. 외부 라이브러리 사용
외부 라이브러리의 유틸리티를 사용하는 몇 가지 솔루션이다.
1) StringUtils 사용
일반적으로 자체 솔루션을 발명하는 대신 기존 솔루션을 사용하는 것이 항상 더 좋다. commons.lang.StringUtils 클래스는 주어진 문자열의 chars 또는 하위 스트링을 계산하는데 사용할 수 있는 countMatches() 메소드를 제공한다.
먼저 적절한 종속성을 포함해야 한다.
1
2
3
4
5
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Maven Central에서 최신 버전을 찾을 수 있다.
이제 countMatches()를 사용 하여 “elephant” 문자열 리터럴의 e문자 수를 계산한다.
1
2
int count = StringUtils.countMatches("elephant", "e");
assertEquals(2, count);
2) Guava 사용
구아바 또한 문자를 계산하는데 도움이 될 수 있다. 종속성을 정의해야 한다.
1
2
3
4
5
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
Maven Central에서 최신 버전을 찾을 수 있다.
Guava가 문자 수를 세는데 어떻게 빠르게 도움이 되는지 본다.
1
2
int count = CharMatcher.is('e').countIn("elephant");
assertEquals(2, count);
3) 스프링 사용
당연히, 단순히 문자를 계산하기 위해 Spring Framework를 프로젝트에 추가하는 것은 의미가 없다.
그러나 프로젝트에 이미 있는 경우 countOccurenceOf() 메서 를 사용하기만 하면 된다.
1
2
int count = StringUtils.countOccurrencesOf("elephant", "e");
assertEquals(2, count);
StringUtils, Guava 또는 Spring의 기존 유틸리티를 사용하는 것이 좋다. 그러나 일반 Java만 사용하는 것이 선호되는 경우 Java 8로 이를 수행할 수 있는 몇 가지 가능성을 제공한다.