replace("특정 문자", "") 결과값의 길이와 기존 문자열의 길이를 비교하면 된다.
String str = "ababbc";
// a의 개수 구하기
int leng = str.length(); // leng = 6
int leng2 = str.replace("a", "").length(); // leng2 = 4
int aCnt = leng - leng2; // 6 - 4 = 2
System.out.println(aCnt); // 2
String의 길이만큼 반복문을 수행하여 특정 문자와 charAt()의 값을 비교한다.
String str = "ababbc";
int aCnt = 0;
// a의 개수 구하기
for(int i=0; i<str.length(); i++) {
if(str.charAt(i) == 'a') aCnt++;
}
System.out.println(aCnt); // 2
아직 스트림이 익숙치 않아서 제일 헷갈리고 어려워서 시행착오가 많았다.
우선 처음에 했던 방법은 아래와 같다.
String str = "ababbc";
int aCnt = s.stream().filter(a->a="c").count();
작성하면서 filter() 부분이 이상하다고 생각했다. 그런데 막상 실행해보니 stream()에서 에러가 났다. 당연했다. stream()은 컬렉션을 스트림으로 변경할 때 사용하는 것이다. (Stream.of(str)을 했을 때는 에러가 나지 않았다. 제대로 확인해봐야겠지만, 출력문으로 stream을 찍어보니 문자열 자체가 스트림으로 변환된 듯 싶다.)
stream은 데이터 소스들, 즉 많은 수의 데이터들을 다루는 것이다. 문자열은 1개인데 문자열 자체를 stream으로 변경할 필요가 없다. 내가 이 문제에 필요한 것은 "문자"이다. 그래서 문자열을 문자배열 또는 리스트로 변경하고, 그 결과를 스트림으로 변환하면 될 것 같았다. 이번엔 문자열을 문자 배열로 변환하는 법이 필요했다.
CharSequence
공식 문서를 보면 "A CharSequence is a readable sequence of char values. This interface provides uniform, read-only access to many different kind of Char Sequences." 라고 되어 있다.
정확한 해석은 아닐 수 있지만 "문자 값들로 이루어진 읽을 수 있는 시퀀스로, 이 인터페이스는 다양한 종류의 문자 시퀀스에 대해 동일한 읽기 전용 접근을 제공한다." 로 해석했다. 문자들로 이루어진 시퀀스에는 여기서 제공하는 메서드들을 사용할 수 있나보다.
** 문자열과 CharSequence의 차이는 더 알아봐야 할 것 같다.
그런데 또 문제가 발생했다. Stream을 생성할 때 가 있었다. 결국 문자 배열을 스트림으로 바꾸려고 하니 되지 않았다. 이것도 Stream.of(arr)만 실행됐지만 문자열 자체가 출력됐다. 다른 방법은 문자 배열을 IntStream으로 변환하는 것인데 이것은 CharSequence의 chars()를 쓰면 더 간단하다.
CharSequence를 사용해 IntStream으로 변환하여 사용하는 코드는 아래와 같다.
String str = "ababbc";
// a의 개수 구하기
long aCnt = str.chars().filter(c -> c == 'a').count();
stream으로 사용하려니 여러 번의 시도를 하게 됐다. 문자 배열로 바꾸는 건 실패했고 split()으로 문자열 배열로 바꿔서 스트림으로 변경해도 되겠지만, CharSequence.chars()로 한번에 변경 가능하니 굳이 그럴 필요가 없을 것 같다.