java-将多个键添加到hashMap中的值

我目前有以下HTML格式的数据:

Year| car type     | # of cars sold
2001| Toyota-Camry | 242435
2000| Honda-Accord | 344423
2001| Honda-Accord | 555255
2000| Honda-Civic  | 342344
2008| Toyota-Prius | 666154
1996| Honda-Accord | 114526
2001| Toyota-Prius | 90234

为了检索此数据,我有一个BufferedReader,它从HTML中读取行.由于存在空白,我在数据出现之前先跳过了几行.所以我的代码目前是

public class carSales {
    private Map<Integer, HashMap<Integer, String>> carSalesMan = 
            new HashMap <Integer, HashMap<Integer, String>>;

private void getcarTypes(String url) {
    try {
    URL urlz = new URL(url);
    URLConnection urlc = myURL.openConnection();
    BufferedReader line = new BufferedReader
    (new InputStreamReader(urlConnection.getInputStream()));

    String next;
    next = line.readLine(); 

    while (next.contains("</s>") {
        String[] parts = next.split(" ");

        if (carSalesMan.isEmpty() || carSalesMan.get(Integer.parseInt(parts[0])) == null {
            carSalesMan.put(Integer.parseInt(parts[0], new HashMap<Integer, String>());
            carSalesMan.get(Integer.parseInt(parts[0])).put(Integer.parseInt(parts[2]), parts[1])

        }
    }
    catch (IOException e) {
    }
}

问题是它似乎只存储具有唯一年份的数据.所以我的carSalesMan变量的大小为4,因为我只有4个唯一的年份,并且随着列表的减少,它们彼此覆盖.有没有简单的方法可以添加所有车型,即使是同一年呢?

解决方法:

由于您的if陈述,只有一项:

    if (carSalesMan.isEmpty() || carSalesMan.get(Integer.parseInt(parts[0])) == null {

您有两个选择,如果您想为每个项目使用不同的插槽,则需要使用@JacobG.答案,或者您可以删除此if语句,并使用一种地图项来存储其值的集合.您将有两种方法来进行第二种选择:

我相信您想要的是MultiValueMap而不是HashMap,它的工作原理几乎与HashMap完全相同,不同之处在于它将值存储在每个键的集合中,而不是每个键仅存储一个值.

它不是官方的Java,但是是开源的.
您可以在这里找到文档:

http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/MultiValuedMap.html

或者,您可以使用扩展HashMap< K,V>的自定义类自己实现它.封装了HashMap< K,Collecton< V>

上一篇:Gradle项目同步在Android Studio 2.3.3中失败


下一篇:java-高效的缓存同步