2017-12-24 29 views
-2
내가 배열에있는 단어의 빈도를 계산해야하는

에 entrySet와 작업을 계속합니다. 그리고 결과를 처리하십시오 (나는 그것이 entrySet이어야한다고 생각합니다) ... entrySet의 순서 또한 중요합니다. 그래서 나는 그 배열은 내가 다음 해결책을 발견자바 8 스트림. 의 LinkedHashMap에 배열을 변환하고 단일 스트림

Map<String, Integer> map = new LinkedHashMap<>(); 
for(String word : words) { 
     Integer count = map.get(word); 
     count = (count == null) ? 1: ++count; 
     map.put(word, count); 
}  

...의 LinkedHashMap로 변환해야하지만 순서는 존중되지 않고, 가정합니다. 그리고 (단,지도 또는 flatMap 포함) 수집 작업없이 스트리밍이 가능한 사용은?

Map<String, Long> collect = 
    wordsList.stream().collect(groupingBy(Function.identity(), counting())); 

감사합니다.

+0

왜이 groupingBy 수집기가의 LinkedHashMap를 작성해야한다고 생각합니까? 그룹별로 다른 수집기가 없지만 작성할 맵의 종류를 지정할 수 있습니까? Collectors의 javadoc을 읽었습니까? –

+0

@JBnizet, 내가 컬렉터 내 작업에 대해 잘 보이는 groupingBy을 이해하지만이의 LinkedHashMap을 생성하지 않는 한 ... 난 그냥 ... 주문 을 유지하는 방법을 요구하고 있지만, 새로운 변환 항목에 사용할 같은 흐름을 계속하는 방법 ... –

+0

나는 그것을 이해합니다. 내 요점은 javadoc을 방금 읽는다면 스스로 찾을 수 있다는 것이다. 독서 문서는 자율적이고 생산적인 프로그래머가되는 열쇠입니다. –

답변

0

당신이 가까이있어하지만이 추천 인수에 소요되는 groupingBy 컬렉터 사용해야합니다 : 당신이 원하는 때문에

LinkedHashMap<String, Long> resultSet = 
       wordsList.stream() 
         .collect(groupingBy(Function.identity(), 
             LinkedHashMap::new, 
              counting())); 

groupingBy 컬렉터의 두 번째 인수가 공급되는 및 귀하의 경우를 LinkedHashMap 그러면 위와 같이 제공해야합니다.

+0

감사합니다! 그것은 일이다. 한 가지 더 묻습니다. 수집하지 않고 변환하는 방법? 변환 후이 스트림을 계속 사용하고 싶습니다. 예 : 항목 값을 기준으로 정렬하는 중 ... 결과 맵에서 새 스트림을 생성해야합니까? 또는 마술 (예 :지도 또는 평면 맵)이 있습니까? –

+0

A.Yam @ 내가 지금 생각할 수있는 하나 개의 솔루션은 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html# (['collectingAndThen'] 사용하는 것입니다 collectingAndThen-java.util.stream.Collector-java.util.function.Function-) 수집기는 groupingBy 후 종류의 새로운 스트림 종류의 값을 만들어야 할 수도 이외의 값으로 마무리 기능을 적용합니다. –