当需要时使用什么结构
持有非唯一键的能力
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->"..."]
答案 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
,它可以包含多个值,因此可以像多图一样有效地工作。
但是我会使用适当的多图来生成代码。