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

时间:2018-04-20 18:31:33

标签: java list set treemap

我有<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语句中添加元素和组,但它只是将每个元素添加到每个键。我很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

问题是你有一个elementSet设置,而不是你的地图,你要添加元素。第一次看到给定的键时,您将元素添加到正确的位置;但在此之后,任何具有相同键的后续元素都会在elementSet中结束,永远不会再被看到。

要解决此问题,您需要删除elementSet,而是使用elementMap.get(i.group)来查找要添加元素的集。

答案 1 :(得分:1)

您描述的算法是正确的。您的实现有一个小问题:检查已正确完成,但您正在添加错误的设置 -

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)的调用。