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


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.