使用TreeMap而不是HashMap的Guava Multimap?

11

我有以下类似的东西:

final SortedMap<Integer,List<Integer>> m = new TreeMap<Integer,List<Integer>>();

我想使用google-guava来创建一个Multimap。然而,我没有找到任何提供持有ArrayList的SortedMap实现。我只看到了HashMap+ArrayList实现(ArrayListMultimap)。是否存在我想要的实现?

2个回答

13

Guava有一个TreeMultimap,可以按排序顺序存储键和值。然而,它使用TreeSet来存储值,而不是List,因此可能并不完全符合你的要求。在这种情况下,Guava允许你创建一个Multimap,以任何想要的方式工作,只需使用其中一个Multimaps.new*Multimap方法,例如Multimaps.newListMultimap。要创建与你描述的相同的Multimap,你只需要编写以下内容:

Map<Integer, Collection<Integer>> map = Maps.newTreeMap();
ListMultimap<Integer, Integer> m = Multimaps.newListMultimap(map,
    new Supplier<List<Integer>>() {
      public List<Integer> get() {
        return Lists.newArrayList(); // assuming you want to use ArrayList
      }
    });

哈...太好了,它比预期要替换的代码更冗长(!)。不过还是谢谢你,我想我会使用它。 - Kevin
2
@Kevin:与实际使用它相比,创建它的冗长程度微不足道。此外,如果您经常需要这样做,可以为要使用的集合类型创建可重用的供应商。 - ColinD
2
使用Java 8的构造函数引用,代码会更加简洁:http://blog.cgdecker.com/2011/04/lambdas-in-java-constructor-references.html ;) - Etienne Neveu
2
哇,我完全忘记在那篇文章中使用了完全相同的例子。=P - ColinD

7
以下是如何创建该工具的步骤:
Multimap<Integer,Integer> multimap = Multimaps.newListMultimap(
    Maps.<Integer, Collection<Integer>>newTreeMap(),
    new Supplier<List<Integer>>() {
        public List<Integer> get() {
            return Lists.newArrayList();
        }
    });

当我写这个的时候,Colin的答案还没有出现 :-) - Sean Patrick Floyd
赞同这个一行代码的写法 :) (使用显式类型参数来调用newTreeMap()方法) - Etienne Neveu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接