2016-06-03 3 views
-2

인스턴트 타임 스탬프 목록을 그룹화하고 자연 순서로 정렬하려고합니다.Java StreamAPI : 인스턴트 키로 맵을 정렬하지 않습니다.

@Test 
    public void testName() throws Exception { 

     List<Instant> asList = Arrays.asList(createInstants()); 

     Map<Instant, List<Instant>> collect = asList.stream().sorted().collect(Collectors.groupingBy((Instant instant) -> instant)); 

     System.out.println(collect); 

    } 

public Instant[] createInstants() { 
    Instant instant1 = Instant.from(ZonedDateTime.of(2016, 12, 25, 12, 25, 30, 0, ZoneId.systemDefault())); 
    Instant instant2 = Instant.from(ZonedDateTime.of(2013, 8, 11, 13, 33, 45, 0, ZoneId.systemDefault())); 
    Instant instant3 = Instant.from(ZonedDateTime.of(2010, 3, 15, 13, 33, 45, 0, ZoneId.systemDefault())); 

    return new Instant[] { instant1, instant2, instant3 }; 
} 

하지만 작동하지 않는 것 같습니다. 대신에 :

{2016-12-25T11:25:30Z=[2016-12-25T11:25:30Z], 2013-08-11T11:33:45Z=[2013-08-11T11:33:45Z],2010-03-15T12:33:45Z=[2010-03-15T12:33:45Z]} 

메신저이 점점 :

{2016-12-25T11:25:30Z=[2016-12-25T11:25:30Z], 2010-03-15T12:33:45Z=[2010-03-15T12:33:45Z], 2013-08-11T11:33:45Z=[2013-08-11T11:33:45Z]} 

을 즉 : 결과가 정렬되지 않습니다. 왜?

+2

'Collectors.groupingBy'는이'지도'를 결과의 분류 - 다움에 대해 어떻게 보증을합니까? –

+0

'List'를 스트리밍 할 필요는 없습니다. 그냥'Arrays.stream (createInstants())'를 사용하십시오. – shmosel

답변

1

사용중인 오버로드가 Collectors.groupingBy() 인 경우 주문한지도를 반환하지 않습니다. 당신이 당신의 결과를 주문하려면 another overloadLinkedHashMap을 지정할 수 있습니다

Collectors.groupingBy((Instant instant) -> instant), LinkedHashMap::new, Collectors.toList()) 
+0

대단히 감사합니다! –

1

Collectors.groupingBy은 주문 보증을하지 않습니다. 실제로는 HashMap을 반환합니다.

(그리고 당신은 세트 대신 여기에지도를하려는 이유도, 그것은 분명하지 않다?)

아마 가장 간단한 해결책은 소트 세트에 수집

collect(toCollection(() -> new TreeSet<>())); 

를 ... 작성하는 것입니다 .

+1

'TreeSet :: new'가 더 좋지 않습니까? – erickson

+0

네, 죄송합니다. 필자는 필자가 비교기가 필요할 것이라고 생각하기 시작했다. –