Как отсортировать MultiMap Гуавы только по ключам?

У меня есть MultiMap из библиотеки Guava. Я хочу отсортировать его только по ключам. Я пытался:

Multimap<String, MyObj> sortedMultiMap =
    TreeMultimap.create(Ordering.from(new Comparator<String>() {
        @Override
        public int compare(String lhs, String rhs) {
            //my comparison here
        }
    }), Ordering.natural());//i want not to sort values at all,MyObj doesn't implement Comparable
sortedMultiMap.putAll(notSortedMultiMap);

Но, как видите, метод TreeMultiMap.create имеет 2 аргумента — компараторы для ключей и значений. Как я могу сортировать MultiMap только по ключам?


person Lester    schedule 28.03.2016    source источник


Ответы (2)


Обновление после ответа от Луи Вассермана Даже если мой первоначальный ответ решил проблему и ответил на вопрос, я думаю, что это более элегантное решение.

Multimap<String, MyObj> multimap = 
    MultimapBuilder.treeKeys(/* you comparator here */).linkedListValues().build();

Вы можете использовать Ordering.arbitrary()< /a> в качестве второго аргумента не требует, чтобы объекты реализовывали Comparable.

Если требуется порядок вставки, вы можете использовать что-то вроде

Multimap<String, MyObj> sortedMultiMap = Multimaps.newMultimap(
            Maps.<String, Collection<MyObj>>newTreeMap(/* your comparator here*/),
            Lists::newLinkedList);
person gustf    schedule 28.03.2016
comment
Я уже пробовал это, но кажется, что Ordering.arbitrary() просто случайным образом смешивает мои значения после putAll. Мне нужен порядок по умолчанию, возможно, он связан со значением MultiMap, хранящимся как коллекция, но должен быть LinkedList? - person Lester; 28.03.2016
comment
Хм, такой же приказ предполагается отдавать при жизни ВМ. Наложенный порядок не имеет никакого значения, но он постоянен на протяжении всей жизни ВМ. Но, может быть, это не работает и в вашем случае использования? - person gustf; 28.03.2016
comment
Означает ли порядок по умолчанию в вашем случае порядок вставки? - person gustf; 28.03.2016
comment
Что вы имеете в виду, говоря, что мне нужен порядок по умолчанию? - person The111; 28.03.2016
comment
Означает ли порядок по умолчанию в вашем случае порядок вставки? - да. Но мой notSortedMultiMap был создан Multimaps.index, который возвращает ImmutableListMultimap, я не могу изменить контейнер для значений - person Lester; 28.03.2016
comment
github.com/google/guava/issues/1522 (это седьмой результат Google для заголовка вашего вопроса) - person The111; 28.03.2016

Используйте 1_:

 Multimap<String, MyObj> multimap = 
      MultimapBuilder.treeKeys().linkedListValues().build();
person Louis Wasserman    schedule 28.03.2016
comment
Хорошо, я обновил свой ответ этим решением, так как это был принятый ответ, и это решение более элегантно. Надеюсь, это нормально для вас. - person gustf; 06.04.2016