2014-01-28 3 views
1

이 질문과 대답 here을 이미 보았지만 사용 사례는 제작 과정에서이를 수행하고 있습니다.Guava MultiMap을 각 키의 값 개수로 정렬하는 방법

나는 그런과 multimap을 생성 할 수 있습니다

:

ImmutableListMultimap<Foo, Bar> indexMultiMap = Multimaps.index(barCollection, new Function<Bar, Foo>() { 
    @Override 
    public Foo apply(Bar bar) { 
     //some works 
     return Foo; 
    } 
    }); 

내가 푸 요소가 고유 것이라는 점을 알고있다, 나는 각 푸 요소의 바 모음의 각 푸 요소 크기의 주파수로이지도를 정렬 할) 이지도에서 내림차순.

1) 어떻게 하나의 반복으로 그 작업을 수행 할 수 있습니까? 이 컬렉션을 멀티 맵에 인덱싱 할 때처럼

2) 그렇다면 효율적인 방법은 무엇입니까?

내 목적 내가이지도를 반복하고 때, 내가

푸 같이, 첫 번째 키 값의 큰 수를 가지고보고 싶어, 모든입니다 -> 3 (이 키에 해당하는 바 모음의 크기)

푸 -> 3

푸 -> 2

푸 -> 1

푸 -> 1

,
+0

샘플 입력 코드도 제공 할 수 있습니까? – Xaerxess

+0

@Xaerxess 입력은 모음집 입니까? 너는 무엇을 더보고 싶어? – oko

답변

1

Multimaps.index()의 javadoc에서부터; 컬렉션은 암시 적 정렬 동작을 '시뮬레이션'하는 방식으로 정렬되어있는 경우

"반환과 multimap에서이 키가 처음 발견 된 순서 ...에 나타납니다", multimap은이 생성됩니다 당신이 원하는 순서. 예 :

SortedMultiset preSorted = TreeMultiset.create(fooComparator); 

다음에 위의 preSorted 컬렉션과 함께 Multimaps.index()을 입력하십시오.

1

@ px5x2로 말했습니다. Multimaps.index()으로 전화하면 키가 처음 나타나는 순서대로 나타납니다. 먼저 컬렉션을 정렬하십시오. Guava Multimaps.index() 예제를 사용하여 여기를 약간 수정합니다.

ImmutableSet<String> digits = ImmutableSet.of("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"); 
Function<String, Integer> lengthFunction = new Function<String, Integer>(){ 
    public Integer apply(String input) { 
     return input.length(); 
    } 
}; 
ImmutableMultimap<Integer, String> sortedOnLength = Multimaps.index(
    Ordering.natural().onResultOf(lengthFunction).sortedCopy(digits), 
    lengthFunction 
); 
관련 문제