Я хотел бы иметь c.g.c.c.Multimap
, отсортированный только по ключам. Значения не должны быть отсортированы. Я пытался создать что-то с TreeMultimap
гуавы, но я не могу его использовать, потому что тип значения не реализует Comparable
.
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;
}
}
Я думал о том, чтобы получить SortedSet
ключей, а затем выполнить итерацию по каждому из этих ключей в отсортированном наборе для получения различных значений, но я надеялся использовать существующую (еще неизвестную) функцию в Guava, а не использовать этот тип < em>взломать.
Примечание. Я не буду реализовывать MyObject
Comparable
, потому что это не имеет смысла с моим реальным объектом.
Пример ввода/вывода:
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());
}
Отпечатки:
1 -> c // or switched with line below
1 -> e
2 -> a
3 -> b // or switched with line below
3 -> d
Multimap
s Гуавы, а неMap
. - person Olivier Grégoire   schedule 31.03.2011