Sorting the data in increasing order based on keys in Multimap Google Guava

大憨熊 提交于 2019-12-07 16:38:08

问题


I created a Multimap

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

my numbers range from 0 to 2400.

I have inserted data like

 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")

I want to sort the Multimap on key field that is Integer? There are not much posts on satckoverflow which tells how to do this.

expected output:

 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")

Please note that the expected output is sorted only on key. If two keys have same value then the key which appeared first should come first. how to enforce this? Is this case automatically taken care when we sort the Multimap on keys?

This is not homework question, trying to play around Google Guava.


回答1:


You want keys in natural order - just use custom Multimap using newListMultimap from Multimaps class:

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

In Java 8 it's shorter:

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

But if you're using Guava 16+ (and you should now), you can use MultimapBuilder which is even more clean:

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

Because you can think of multimap as map key -> collection, just use JDK's TreeMap which is sorted according to the natural ordering of its keys.

Example:

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



回答2:


If you can use an immutable multimap, and don't need to mutate the multimap, then it's fairly simple:

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


来源:https://stackoverflow.com/questions/20335170/sorting-the-data-in-increasing-order-based-on-keys-in-multimap-google-guava

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!