Java映射中的多个集合

Java映射中的多个集合,java,set,maps,Java,Set,Maps,我从一个CSV文件中读取数据,该文件包含关于山丘的数据,所有的读取等工作正常,但现在我想创建一个地图,将“县名称”(文件中的列标题)与所有包含县名称的山丘相关联 我走的是正确的道路,因为我的代码适用于第一个countyName,但问题是当我的for循环If语句转到else语句时,我希望它从技术上创建另一个集合(清除以前的值),并用县名称分配新的hill数据 我的输出是: {Perth and Kinross=[16,Knock of Crieff,Perth and Kinross,279.0,

我从一个CSV文件中读取数据,该文件包含关于山丘的数据,所有的读取等工作正常,但现在我想创建一个地图,将“县名称”(文件中的列标题)与所有包含县名称的山丘相关联

我走的是正确的道路,因为我的代码适用于第一个countyName,但问题是当我的for循环If语句转到else语句时,我希望它从技术上创建另一个集合(清除以前的值),并用县名称分配新的hill数据

我的输出是:

{Perth and Kinross=[16,Knock of Crieff,Perth and Kinross,279.0,56.389329,-3.826973, 3,Creag Uchdag,Perth and Kinross,879.0,56.465278,-4.098107]}
所有的山上都有“珀斯和金罗斯”。所以现在我的下一个县名是“斯特林”,例如,所以地图应该是这样结束的

{Perth and Kinross=[16,Knock of Crieff,Perth and Kinross,279.0,56.389329,-3.826973, 3,Creag Uchdag,Perth and Kinross,879.0,56.465278,-4.098107], Stirling=[7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645]}
我不确定的是如何在不清除为Perth和Kinross存储的值的情况下创建另一个集合

我的代码是:

    Map<String, Set<Hill>> hillsByCounty = new HashMap<>();

        if (h.getCounty().equals(countyName)) {
            hillsByCounty.get(countyName);
            currentSet.add(h);
            hillsByCounty.put(countyName, currentSet);

        } else {

            countyName = h.getCounty();
            currentSet.clear();
            currentSet.add(h);

        }
    }

    return hillsByCounty;
}

因为它覆盖了集合。我的解决办法是什么

重复使用同一组。因此,如果您的县发生更改,则清除该集并用下一个县填充它。相反,您应该创建一个新集合。只要你重复使用同一个集合,那么,你重复使用同一个集合,清空它并在其中填充其他内容
hillsByCounty.put(…)
不克隆集合,只存储一个引用。

地图中每个条目的值都是相同的集合,因此对一个集合的每次修改也会出现在其他条目上。 可以在循环体中检查现有集:

for (Hill h : hills) {
    Set<Hill> currentSet = hillsByCountry.get(h.getCountry());
    if (currentSet == null) {
        currentSet = new HashSet<>();
        hillsByCountry.put(h.getCountry(), currentSet);
    }
    currentSet.add(h);
}
for(山丘h:山丘){
Set currentSet=hillsByCountry.get(h.getCountry());
if(currentSet==null){
currentSet=新的HashSet();
hillsByCountry.put(h.getCountry(),currentSet);
}
currentSet.add(h);
}

“为什么这段代码不起作用?”这类问题与主题无关。请使用调试器查找错误,如果您有具体问题要解决,请返回。@Vampire我不是说它不工作,我想知道为什么我的集被覆盖了。我编辑并添加了我的代码的代码片段,它还显示了我希望它做什么。我只是不知道我的代码在哪里出错,这就是调试器的作用,你可以用它逐级检查代码,看看错误在哪里。您的代码不工作,这是一个经典问题,您不应该在这里发布,而应该使用调试器。因为问题很明显,我还是发布了一个答案,但请不要在这里发布“为什么这段代码不能像我预期的那样工作”,根据SO规则,它们是离题的。您可以看到您是如何说创建一个新的集合的,因为它是一个CSV文件,显然包含100多个县名,所以,制作一套新的,不是意味着我只能有两套吗?你为什么这么认为?因为你是说,如果我重复使用同一套,清空它,然后用其他东西填充它,总的结果会不会是一样的,除非我为每个县名都有一套新的?当然,我是这么说的。您的问题是,当您实际上应该为每个县创建一个新集时,您正在重用相同的集。我知道这会检查是否存在现有集,如果存在,则会创建一个新集?如果没有现有集,则会创建一个新集;)
for (Hill h : hills) {
    Set<Hill> currentSet = hillsByCountry.get(h.getCountry());
    if (currentSet == null) {
        currentSet = new HashSet<>();
        hillsByCountry.put(h.getCountry(), currentSet);
    }
    currentSet.add(h);
}