Java 具有非唯一键的已排序映射

Java 具有非唯一键的已排序映射,java,collections,Java,Collections,需要时使用什么结构 按键对元素排序 持有非唯一密钥的能力 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",

需要时使用什么结构

  • 按键对元素排序
  • 持有非唯一密钥的能力

    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->"..."]
    
    Structure struct=新结构;
    结构添加(3,“…”);
    结构添加(1,“约翰”);
    结构添加(2,“埃德温”);
    结构添加(1,“玛丽”);
    struct.toString()=={key->value;}[1->“John”,1->“Mary”,2->“Edwin”,3->“…]
    

  • 如果您想使用标准JavaAPI,我会选择一个
    TreeMap

    • 元素按键排序,因为它是一个
      SortedMap
      。从文档中:

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

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

    这种类型的结构称为排序多重映射,有几种实现在第一次插入时隐藏创建初始集的详细信息。请看一看或举个例子


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

    听起来您可能需要一个
    映射
    ,以便每个键映射到一个字符串列表(或其他集合)

    ApacheCommons有一个函数,它可以实现上述功能,而无需编写代码

     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也会提供类似的功能。

    除了使用Apache Commons或Guava的多地图实现,或者按照其他答案的建议实现一个
    类之外,您只需使用
    树地图即可。它不再是一个键映射到单个
    字符串
    ,而是映射到一个
    列表
    ,该列表可以保存多个值,因此可以像多重映射一样有效地工作

    但我还是要为生产代码提供一个合适的多重映射