在 Java 8 中向 TreeMap 中的键添加多个值

Adding multiple values to a key in a TreeMap in Java 8

我有一个 <Integer, <Set<Element>>> TreeMap,我正在尝试向其添加键和值,但是我不知道如何向键添加多个值,我查看了其他帖子并在线搜索了但是找不到我的代码的任何内容。我有一个要迭代的元素(周期性元素)列表,元素包含元素名称、组号、权重等的详细信息,我试图使用组号作为键,然后使用所有其他值(重量、名称等),包括它们值的键。

所以像这样:

1(key):
1,H,Hydrogen,1(group num),1,1.008
3,Li,Lithium,1,2,6.94
11,Na,Sodium,1,3,22.98976928
2(key):
4,Be,Beryllium,2(group num),2,9.0121831
12,Mg,Magnesium,2,3,24.305
20,Ca,Calcium,2,4,40.078

我使用 for 循环遍历列表,然后检查组号是否是映射中的键,如果是,我将元素添加到集合中。如果组号不在地图中,那么我将元素添加到新集合中,然后将该组号和新集合添加到地图中。

我的代码:

public static Map<Integer, Set<Element>> elementsByGroup(List<Element> elements){
Map<Integer, Set<Element>> elementMap = new TreeMap<>();
Set<Element> elementSet = new TreeSet<>(new ElementNumComparator());

for (Element i: elements){
    if(elementMap.containsKey(i.group)){
        elementSet.add(i);

    }
    else{
       Set<Element> newSet = new TreeSet<>(new ElementNumComparator());
       newSet.add(i);
       elementMap.put(i.group, newSet);
    }
}

打印时输出:

1/[55, Cs, Caesium, 1, 6, 132.905452]
2/[56, Ba, Barium, 2, 6, 137.327]
3/[89, Ac, Actinium, 3, 7, 227.0]
4/[72, Hf, Hafnium, 4, 6, 178.49]
5/[41, Nb, Niobium, 5, 5, 92.90637]
6/[24, Cr, Chromium, 6, 4, 51.9961]
7/[25, Mn, Manganese, 7, 4, 54.938044]
8/[26, Fe, Iron, 8, 4, 55.845]
9/[27, Co, Cobalt, 9, 4, 58.933194]
10/[28, Ni, Nickel, 10, 4, 58.6934]
11/[29, Cu, Copper, 11, 4, 63.546]
12/[48, Cd, Cadmium, 12, 5, 112.414]
13/[13, Al, Aluminium, 13, 3, 26.9815385]
14/[6, C, Carbon, 14, 2, 12.011]
15/[51, Sb, Antimony, 15, 5, 121.76]
16/[8, O, Oxygen, 16, 2, 15.999]
17/[85, At, Astatine, 17, 6, 210.0]
18/[18, Ar, Argon, 18, 3, 39.948]

然而,当应该有多个元素时,它只打印每组中的一个元素。我尝试在 if 语句中添加元素和组,但它只是将每个元素添加到每个键。如果能提供任何帮助,我将不胜感激。

问题是您有一个 elementSet 集,它不在您的地图中,您要向其添加元素。第一次看到给定的键时,您将元素添加到正确的位置;但在那之后,任何具有相同键的后续元素都会在 elementSet 中结束,再也不会出现。

要解决此问题,您需要消除 elementSet,然后使用 elementMap.get(i.group) 找到要将元素添加到的集合。

您描述的算法是正确的。您的实施有一个小问题:检查正确完成,但您添加到错误的集合 -

if(elementMap.containsKey(i.group)){
    elementSet.add(i);
}

应该是

if(elementMap.containsKey(i.group)){
    elementMap.get(i.group).add(i);
}

您可以通过如下更改代码来进一步统一代码路径:

Set<Element> current = elementMap.get(i.group);
if (current == null) {
    current = new TreeSet<>(new ElementNumComparator());
    elementMap.put(i.group, current);
}
current.add(i);

这将检查键是否存在与检索相应的 Set<Element> 相结合,并且对两个代码分支都调用 add(i)