地图中的Java多个集合

时间:2017-04-03 11:57:42

标签: java set maps

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

我沿着正确的道路,因为我的代码适用于第一个countyName,但问题是当我的for循环If语句转到else语句时,我希望它在技术上创建另一个集合(清除以前的值)和使用县名

分配新的山丘数据

我的输出是:

{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”,所以地图最终应该像

{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]}

我不确定的是如何在不清除为珀斯和金罗斯存储的值的情况下创建另一组

我的代码是:

    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;
}

究竟哪里出错了。我觉得这是明确的功能,但我不确定我会怎么做。

我当前的代码打印出来:

{Perth and Kinross=[7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645], Stirling=[7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645]}

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

2 个答案:

答案 0 :(得分:0)

您重复使用相同的设置。因此,如果您的县更改,您清除该集并将其填入下一个县。相反,你应该创建一个新的集合。只要您重复使用相同的集合,您就可以重用相同的集合,清空它并在其中填充其他内容。 hillsByCounty.put(...)不会克隆集合,而只是存储引用。

答案 1 :(得分:0)

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

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);
}