使用非唯一键排序地图

Eug*_*neP 13 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->"..."]
    
    Run Code Online (Sandbox Code Playgroud)

aio*_*obe 12

如果你想使用标准的Java API,我会选择一个TreeMap<Integer, Set<String>>.

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

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

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

这种类型的结构称为有序多图,并且有几个实现在第一次插入时隐藏了创建初始集的细节等.例如,看看GuavaApache Commons.

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


Bri*_*new 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);
Run Code Online (Sandbox Code Playgroud)

coll将是一个包含"A","B","C"的集合.

我怀疑,Google Collections会提供类似的东西.