使用非唯一键排序地图

时间:2010-11-02 08:08:31

标签: java collections

当需要时使用什么结构

  1. 按键排序元素
  2. 持有非唯一键的能力

    Structure<Integer, String> struct = new Structure<Integer, String>;
    struct.add(3,"...");
    struct.add(1,"John");
    struct.add(2,"Edwin");
    struct.add(1,"Mary");
    struct.toString() == {key-> value;} [1->"John",1->"Mary",2->"Edwin",3->"..."]
    

3 个答案:

答案 0 :(得分:11)

如果您想使用标准Java API,我会选择TreeMap<Integer, Set<String>>

  • 元素按键排序,因为它是SortedMap。来自文档:

      

    地图是根据其键的自然顺序排序的,或者是通常在排序地图创建时提供的比较器。迭代有序映射的集合视图(由entrySet,keySet和values方法返回)时会反映此顺序。

  • 该结构允许使用非唯一键,因为您可以让一个键映射到多个对象。

这种类型的结构称为排序的多映射,并且有几个实现在第一次插入时隐藏创建初始集的细节等。看看{{3}例如,或Guava

根据您的需要,您还可以拥有SortedSet<Pair<Integer, String>>,其中元素在对中的左侧元素上排序。 (请注意,您自己应该编写Pair类,但它不应该超过几行。)

答案 1 :(得分:5)

听起来你可能需要一个Map<Integer, List<String>>,所以每个键都映射到一个列表(或其他集合)的字符串。

Apache Commons有一个MultiMap,它可以完成上述工作而无需编写代码的麻烦。

 MultiMap mhm = new MultiHashMap();
 mhm.put(key, "A");
 mhm.put(key, "B");
 mhm.put(key, "C");
 Collection coll = (Collection) mhm.get(key);

coll将是一个包含“A”,“B”,“C”的集合。

Google Collections将提供类似的内容,我怀疑。

答案 2 :(得分:2)

除了使用Apache Commons或Guava的多图实现,或者按照其他答案的建议实现Pair类之外,您只需使用TreeMap<Integer,List<String>>即可。现在,它不是映射到单个String的键,而是映射到List,它可以包含多个值,因此可以像多图一样有效地工作。

但是我会使用适当的多图来生成代码。