반응형
문자 개수를 세는 예제를 분석해봤습니다.
간단한데, 공부가 부족해서 그런가 이것조차도 어려웠습니다.
이를 반성해서 조금 더 분발해야겠습니다.
1번 풀이
//이 메소드는 charcacter를 키로 하고, integer를 값으로 가지는 map을 반환받습니다.
//그리고 메소드명은 중복 문자를 카운트 한다는 의미입니다.
public Map<Character, Integer> countDuplicateCharacters(String str) {
//맵타입의 해쉬맵 객체를 생성합니다.
Map<Character, Integer> result = new HashMap<>();
//문자열의 길이만큼 반복문을 돌려줄 것입니다.
for (int i = 0; i < str.length(); i++) {
//문자열의 특정인덱스의 문자를 반환받고 다시 char 변수에 저장해줍니다.
char ch = str.charAt(i);
//여기서 맵 객체의 compute 메소드와 람다식을 활용해줄 것입니다.
//상세히 설명하면, ch는 현재 처리할 문자를 의미합니다.
//그리고 k는 처리할 문자인 ch를 의미하며, v는 카운트를 의미하는 값입니다.
//람다식에서는 다음과 같이 동작합니다.
//k(ch)가 맵 객체에 존재하지 않는다면 자연스럽게 v는 null이 되고 삼항 연산자에 따라서
//v에 1이 저장됩니다. 그리고 기존에 값이 있다면 v는 카운트가 추가될 것입니다.
result.compute(ch, (k, v) -> (v == null) ? 1 : ++v);
}
return result;
}
2번 풀이
이 풀이는 교재 내용을 분석한 것이고, 그럼에도 제가 이해가 가지를 않아서 챗gpt를 이용해서 다시 해석해봤습니다.
사실상 챗gpt가 다하였지만, 그래도 도움이 많이 되었습니다.
//맵 타입을 반환받는 메소드입니다.
public Map<Character, Long> countDuplicateCharacters(String str) {
//str.chars()로 int스트림을 반환받고, 다시 mapToObj로 문자스트림을 반환받습니다.
Map<Character, Long> result = str.chars().mapToObj(c -> (char) c)
//그리고 그것을 다 끝내고 그룹핑한 뒤에는 숫자를 카운팅해주는 게 매커니즘입니다.
.collect(Collectors.groupingBy(c -> c, Collectors.counting()));
return result;
}
str.chars():
- 문자열 str을 스트림으로 변환합니다. 이 메소드는 문자열을 IntStream으로 변환하여 각 문자의 유니코드 값을 스트림 형태로 제공합니다.
.mapToObj(c -> (char) c):
- IntStream의 각 정수(문자의 유니코드 값)를 Character 객체로 변환합니다. 즉, 각 문자로 매핑됩니다
.collect(...):
- 스트림의 요소를 수집하여 맵 형태로 변환합니다.
Collectors.groupingBy(c -> c, Collectors.counting()):
- groupingBy는 주어진 키 함수(여기서는 각 문자)로 요소를 그룹화합니다.
- 각 그룹에 대해 Collectors.counting()을 사용하여 해당 그룹의 요소 수를 셉니다.
- 이 결과로 각 문자가 키, 그 문자의 출현 횟수가 값인 맵이 생성됩니다.
전체적인 흐름
- 문자열을 스트림으로 변환합니다.
- 각 문자를 Character 객체로 변환합니다.
- 각 문자를 기준으로 그룹화하여 출현 횟수를 셉니다.
- 최종 결과를 반환합니다.
반응형