【问题标题】:Sorting TreeMultiMap based on key and ignore value基于键和忽略值对TreeMultiMap进行排序
【发布时间】:2016-06-05 16:26:16
【问题描述】:

所以我做了一些研究并得出结论,我需要使用多树图,当我使用树图时,它允许我根据键进行排序,但是我需要多个值,尽管使用树形图可以解决这个问题。

我的目标是按用户的优先级对用户进行排序,但是大多数用户的默认优先级为 0,其中一个优先级覆盖其他用户(这就是我需要多地图的原因)。但是我不知道如何构建 TreeMultiMap。

我从来没有真正用比较器做过任何工作,这是我现在的主要问题。我希望有人能指出我正确的方向,或者完全可以让我解决问题的方向。

请注意,TreeMap<Integer, List<Entry>> 确实出现在我的脑海中,但我不想使用它,因为它看起来很乱,而且我确信有更好、更简单的方法来实现我所需要的。

谢谢

【问题讨论】:

  • 我添加了关于我拥有的代码的部分,但我从未弄清楚如何创建 TreeMultiMap 而不会出错
  • TreeMultimap.create(): 创建一个空的 TreeMultimap,按其键和值的自然顺序排序。 这很容易。 --- 注意TreeMultimap“键和值是有序的”。如果您不想对值进行排序,那么这不适合您。 TreeMap<Integer, List<Entry>> 将对键进行排序,但值按插入顺序排列,因此如果您希望它以这种方式运行,那么这可能是正确的答案。

标签: java sorting guava


【解决方案1】:

Guava 的Multimap implementations 没有公共构造函数,因此会出现“错误”问题——您应该使用静态方法(即每个实现中的create)来构造多映射的实例。你可能对TreeMultimap.create()(不是“map”中没有大写“m”)感兴趣,它创建了SortedSetMultimap,大致相当于TreeMap<K, TreeSet<V>>。例如:

SortedSetMultimap<Integer, String> multimap = TreeMultimap.create();
multimap.put(0, "zero");
multimap.put(0, "nought");
multimap.put(1, "one");
System.out.println(multimap);
// prints: {0=[nought, zero], 1=[one]}

另一方面,如果您不想(或不能)对值进行排序,可以使用自定义多图,可以使用MultimapBuilder 创建:

ListMultimap<Integer, Entry> multimap = 
    MultimapBuilder.treeKeys().arrayListValues().build();

【讨论】:

    【解决方案2】:

    因此,根据 Xaerxess 提供的信息,我决定研究 Guava 提供的其他地图和实现,但找到了一种基于树状图创建排序多图的方法。

    然后我使用了一个逆序比较器,它允许我根据需要对值进行排序。感谢其他所有评论信息的人,因为它非常有帮助。

    我最终使用的代码如下:

    Multimap<Integer, Entry> sortedMap = Multimaps.newListMultimap(new TreeMap<>(Collections.reverseOrder()), Lists::newArrayList);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2015-12-13
      • 1970-01-01
      • 2014-07-19
      • 2012-07-02
      • 2022-10-28
      • 1970-01-01
      相关资源
      最近更新 更多