주문 보존 세트에 수집하는 수집기가 있습니까?


107

Collectors.toSet()질서를 유지하지 않습니다. 대신 Lists를 사용할 수 있지만 결과 컬렉션이 요소 복제를 허용하지 않는다는 것을 나타내려고 Set합니다. 이것이 바로 인터페이스의 용도입니다.


그런 것은 존재하지 않는다고 생각합니다. 나도 하나가 필요하다는 것을 알고, 직접 작성해야했습니다.
markspace

시겠습니까 SortedSet일? 그렇지 않다면 관습이 갈 길이다.
AntonH

@AntonH 아니요, O (log n)보다 O (1) 작업을 선호합니다.
gvlasov

1
코드를 게시했는데 정확히 필요한 것은 아니지만 시작할 수 있습니다.
markspace

답변:


203

toCollection원하는 세트의 구체적인 인스턴스를 사용 하고 제공 할 수 있습니다 . 예를 들어 게재 신청서를 유지하려는 경우 :

Set<MyClass> set = myStream.collect(Collectors.toCollection(LinkedHashSet::new));

예를 들면 :

public class Test {    
    public static final void main(String[] args) {
        List<String> list = Arrays.asList("b", "c", "a");

        Set<String> linkedSet = 
            list.stream().collect(Collectors.toCollection(LinkedHashSet::new));

        Set<String> collectorToSet = 
            list.stream().collect(Collectors.toSet());

        System.out.println(linkedSet); //[b, c, a]
        System.out.println(collectorToSet); //[a, b, c]
    }
}

좋아, 그게 바로 내가 필요한 것이지만 ImmutableSet내 경우에는 구아바가 더 나을 것이라고 생각 합니다. 수집하는 수집가를 어떻게 만들 수 있는지에 대한 아이디어가 ImmutableSet있습니까? 그 경우는 내장되어 있습니다 ImmutableSet.Builder하지 않은 Collection그래서 당신이 할 것입니다 방법을 알아낼 수 없습니다, Supplier대한 Collectors.toCollection()경우이다.
gvlasov

@Susei 나는 그것을 조사하려고 노력할 것이다. 대안은 수정할 수없는 집합을 반환하는 것입니다. 예 :Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis C.

@Susei 내가 찾은 가장 가까운 : Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();결과 집합을 Collections.unmodifiableSet.
Alexis C.

여기에 이미 주제에서 벗어난 질문이 있습니다 (물론 훌륭한 답변에 대한 더 많은 담당자) : stackoverflow.com/questions/27612165/…
gvlasov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.