根据Multimap Google Guava中的键,按递增顺序对数据进行排序

时间:2013-12-02 18:24:46

标签: java key guava multimap

我创建了一个Multimap

Multimap<Integer, String> mhm= ArrayListMultimap.create();

我的数字范围从0到2400。

我已插入数据

 mhm.put(800 ,"A")
 mhm.put(1200 ,"B")
 mhm.put(1200 ,"A")
 mhm.put(1500 ,"B")
 mhm.put(600 ,"A")
 mhm.put(700 ,"B")
 mhm.put(1200 ,"A")
 mhm.put(1201 ,"B")

我想在关键字段Integer上对Multimap进行排序? satckoverflow上没有太多帖子告诉你如何做到这一点。

预期产出:

 mhm.put(600 ,"A")
 mhm.put(700 ,"B")
 mhm.put(800 ,"A")
 mhm.put(1200 ,"B")
 mhm.put(1200 ,"A")
 mhm.put(1200 ,"A")
 mhm.put(1201 ,"A")
 mhm.put(1500 ,"B")

请注意,预期输出仅按键排序。 如果两个键具有相同的值,则首先出现的键应该首先。 如何执行这个?我们在按键上对Multimap进行排序时会自动注意这种情况吗?

这不是家庭作业问题,试图围绕谷歌番石榴玩。

2 个答案:

答案 0 :(得分:6)

您希望密钥按自然顺序排列 - 只需使用newListMultimap from Multimaps class自定义Multimap

ListMultimap<Integer, String> mhm = Multimaps.newListMultimap(
  new TreeMap<Integer, Collection<String>>(),
  new Supplier<List<String>>() {
    public List<String> get() {
      return Lists.newArrayList();
    }
  });

在Java 8中它更短:

ListMultimap<Integer, String> mhm = Multimaps.newListMultimap(
    new TreeMap<>(), ArrayList::new);

但如果您使用的是Guava 16+(现在就应该使用),您可以使用更加干净的MultimapBuilder

ListMultimap<Integer, String> mhm = MultimapBuilder.treeKeys().arrayListValues().build();

因为您可以将multimap视为地图关键字 - &gt;集合,只需使用JDK的TreeMap 按照其键的自然顺序排序

示例:

mhm.put(2, "some");
mhm.put(1, "value");
mhm.put(2, "here");
System.out.println(mhm.toString());
// { 1: [ "value" ], 2: [ "some", "here" ] }

答案 1 :(得分:5)

如果你可以使用不可变的多图,并且不需要改变多图,那么它很简单:

new ImmutableListMultimap.Builder<Integer, String>
   .orderKeysBy(Ordering.natural())
   .putAll(multimap) // or put each entry
   .build();