Having a Multimap sorted on keys only in Java
Multimaps.index
returns an ImmutableListMultimap
, so you wouldn't be able to sort it after creating it. You could, however, first create a sorted copy of your Iterable<MyObject>
and feed that to Multimap.index
... ImmutableListMultimap
keeps things in the same order it was given them.
public static ImmutableMultimap<Integer, MyObject> indexOnScore(Iterable<MyObject> i) {
List<MyObject> sorted = Ordering.natural().onResultOf(myObjectToScore())
.sortedCopy(i);
return Multimaps.index(sorted, myObjectToScore());
}
Another option might be to create a TreeMultimap
and use Ordering.arbitrary()
as the Comparator
for the values.
MultimapBuilder
was introduced in Guava 16:
<K extends Comparable<? super K>, V> ListMultimap<K, V> multimap() {
return MultimapBuilder.treeKeys().linkedListValues().build();
}
That keeps your keys sorted by their natural order (MultimapBuilder::treeKeys
is also overloaded to accept a custom comparator), and the values associated with each key are maintained in a LinkedList
(ArrayList
and HashSet
are among the other options).
Though the OP's specific situation seems to have been answered using immutable multimap building functions, I needed a mutable version of what he was asking for. In case it helps anyone, here's the generic method I ended up creating:
static <K, V> Multimap<K, V> newTreeArrayListMultimap(
final int expectedValuesPerKey)
{
return Multimaps.newMultimap(new TreeMap<K, Collection<V>>(),
new Supplier<Collection<V>>()
{
@Override
public Collection<V> get()
{
return new ArrayList<V>(expectedValuesPerKey);
}
});
}