Post

문자열에서 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로 이를 수행할 수 있는 몇 가지 가능성을 제공한다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.