我想要一个仅基于键排序的 c.g.c.c.Multimap
。这些值不应该被排序。我尝试用 guava 的 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 中的功能,而不是使用这种 hack。
注意:我不会让 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
最佳答案
Multimaps.index
返回 ImmutableListMultimap
,因此您将无法在创建后对其进行排序。但是,您可以先创建 Iterable<MyObject>
的排序副本。并将其提供给 Multimap.index
... ImmutableListMultimap
保持元素的顺序。
public static ImmutableMultimap<Integer, MyObject> indexOnScore(Iterable<MyObject> i) {
List<MyObject> sorted = Ordering.natural().onResultOf(myObjectToScore())
.sortedCopy(i);
return Multimaps.index(sorted, myObjectToScore());
}
另一个选项可能是创建一个 TreeMultimap
并使用 Ordering.arbitrary()
作为Comparator
值。
关于java - 仅在 Java 中对键进行排序的 Multimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5501468/