Tendo um Multimap classificado em chaves apenas em Java
Gostaria de ter umc.g.c.c.Multimap
que é classificado com base apenas em chaves. Os valores não devem ser classificados. Eu tentei criar algo com @ goiaTreeMultimap
, mas não posso usá-lo porque o tipo de valor não implementaComparable
.
public class MyObject /* doesn't implement Comparable */ {
private String name;
private int score;
// Getters/setters are implemented
public static Function<MyObject,Integer> myObjectToScore {
@Override public Integer apply (MyObject o) { return o.score; }
}
public static Multimap<Integer,MyObject> indexOnScore(Iterable<MyObject> i) {
Multimap<Integer,MyObject> m = Multimaps.index(i, myObjectToScore());
// Do the sort of the keys.
return m;
}
}
Eu pensei em conseguir umSortedSet
das chaves, iterando sobre cada uma dessas chaves no conjunto classificado para buscar os vários valores, mas eu esperava usar um recurso existente (ainda não descoberto) no Guava em vez de usar esse tipo de hack.
Nota: eu não vou fazerMyObject
implementoComparable
porque não faz sentido com o meu objeto rea
Exemplo de entrada / saída:
Set<MyObject> s = Sets.newHashSet(
new MyObject("a", 2),
new MyObject("b", 3),
new MyObject("c", 1),
new MyObject("d", 3),
new MyObject("e", 1)
); // Assuming constructor MyObject(String name, int score)
for (Map.Entry<Integer, MyObject> e: MyObject.indexedOnScore(s).entries()) {
System.out.printf("%d -> %s%n", e.getKey(), e.getValue().getName());
}
Prints:
1 -> c // or switched with line below
1 -> e
2 -> a
3 -> b // or switched with line below
3 -> d