java - 仅在 Java 中对键进行排序的 Multimap

标签 java sorting guava multimap

我想要一个仅基于键排序的 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/

相关文章:

algorithm - 将 ms 时间戳转换为连续的唯一 32 位数字?

java - 使用 Mockito 调用验证 super.method()

java - JTable keypressed 事件仅在按下的第一个键时触发

javascript - 当排序字符串时应该 é 在 e 之前

.net - 如果 DataGrid 列已排序(而不是排序),我如何收到通知

java - java android中的ArrayList groupby基于没有java 8流和lambda的相同属性

java - 并行创建匹配表

java - 是否有具有可预测迭代顺序(插入顺序)的 BiMap 实现?

Java - 如果数据太小,刷新进程的 OutputStream 不会立即发送数据

java - 带字符串和 double 的 JFreechart