source

groupBy에서 발생한 횟수를 어떻게 셀 수 있습니까?

factcode 2022. 10. 27. 23:01
반응형

groupBy에서 발생한 횟수를 어떻게 셀 수 있습니까?

스트림 내의 아이템을 동일한 오브젝트를 그룹화하여 발생 횟수로 매핑하는 맵으로 정리하고 싶습니다.

List<String> list = Arrays.asList("Hello", "Hello", "World");
Map<String, Long> wordToFrequency = // what goes here?

이 경우 맵은 다음 엔트리로 구성됩니다.

Hello -> 2
World -> 1

내가 어떻게 그럴 수 있을까?

생각에 넌 그저 과부하를 찾고 있는 것 같아Collector 나서 다시번지르르하다.Collectors.counting()★★★★★★★★★★★★★★★★★★:

import java.util.*;
import java.util.stream.*;

class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("Hello");
        list.add("Hello");
        list.add("World");

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

        System.out.println(counted);
    }
}

결과:

{Hello=2, World=1}

(할 수도 있어요.groupingByConcurrent을 사용하다문맥상 안전하다면 실제 코드에 유의해야 할 사항입니다.)

다음은 개체 목록의 예입니다.

Map<String, Long> requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting()));
List<String> list = new ArrayList<>();

list.add("Hello");
list.add("Hello");
list.add("World");

Map<String, List<String>> collect = list.stream()
                                        .collect(Collectors.groupingBy(o -> o));
collect.entrySet()
       .forEach(e -> System.out.println(e.getKey() + " - " + e.getValue().size()));

다음은 당면한 작업을 수행하기 위한 약간 다른 옵션입니다.

를 사용합니다.toMap:

list.stream()
    .collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact));

를 사용합니다.Map::merge:

Map<String, Integer> accumulator = new HashMap<>();
list.forEach(s -> accumulator.merge(s, 1, Math::addExact));

다음은 Stream에 의한 간단한 솔루션입니다.:

StreamEx.of(list).groupingBy(Function.identity(), MoreCollectors.countingInt());

코드 "Java"를 수 .collect(Collectors.

수 있는 「」를 할 수 .Collectors2Eclipse 컬렉션의 클래스:List a까지Bag, 「」의StreamA는 계산을 위해 구축된 데이터 구조입니다.

Bag<String> counted =
        list.stream().collect(Collectors2.countBy(each -> each));

Assert.assertEquals(1, counted.occurrencesOf("World"));
Assert.assertEquals(2, counted.occurrencesOf("Hello"));

System.out.println(counted.toStringOfItemToCount());

출력:

{World=1, Hello=2}

'만들기'라고 할 수 .collectLista a 에 직접Bag.

Bag<String> counted = 
        list.stream().collect(Collectors2.toBag());

하다, 하다, 하다, 이렇게 도 있어요.Bag를 하지 않고Stream 개작하여List이클립스 컬렉션 프로토콜을 사용합니다.

Bag<String> counted = Lists.adapt(list).countBy(each -> each);

또는 이 경우에는 다음과 같습니다.

Bag<String> counted = Lists.adapt(list).toBag();

가방을 직접 만들 수도 있습니다.

Bag<String> counted = Bags.mutable.with("Hello", "Hello", "World");

A Bag<String>a a 같다Map<String, Integer> 만약에...Map있지 않은됩니다.null★★★★★★★★★★★★★★★★★★★★★★★.Bag키에는 사용하지 않습니다.occurrencesOf. , 0 이 됩니다.

주의: 저는 Eclipse Collections의 커밋입니다.

언급URL : https://stackoverflow.com/questions/25441088/how-can-i-count-occurrences-with-groupby

반응형