Как отсортировать Guava MultiMap по количеству значений для каждого ключа

Я уже видел этот вопрос и ответил здесь, но мой вариант использования делая это в процессе создания.

Я могу создать мультикарту следующим образом:

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

Я знаю, что элементы Foo будут уникальными, и я хочу отсортировать эту карту по частоте каждого размера элемента Foo в коллекции Bar каждого элемента Foo) на этой карте по убыванию.

1) Как я могу сделать это за одну итерацию? Например, при индексации этой коллекции в MultiMap.

2) Если нет, то как это сделать?

Моя цель вообще, когда я повторяю эту карту, я хочу видеть, что первый ключ имеет большее количество значений, например

Foo -> 3 (размер коллекции баров, соответствующий этому ключу)

Фу -> 3

Фу -> 2

Фу -> 1

Фу -> 1


person oko    schedule 28.01.2014    source источник
comment
Можете ли вы также дать нам пример кода ввода?   -  person Xaerxess    schedule 28.01.2014
comment
Ввод @Xaerxess - это просто Collection‹Bar›? Что вы хотите увидеть больше?   -  person oko    schedule 28.01.2014


Ответы (2)


Из javadoc Multimaps.index();

"В возвращенной мультикарте ключи появляются в том порядке, в котором они встречаются впервые..."

Если коллекция отсортирована таким образом, который «имитирует» неявное поведение сортировки, мультикарта будет создана в нужном вам порядке. например:

SortedMultiset preSorted = TreeMultiset.create(fooComparator);

затем накормите Multimaps.index() вышеуказанной предварительно отсортированной коллекцией.

person px5x2    schedule 28.01.2014

Как сказал @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
);
person hakunami    schedule 03.07.2015