java - HashMap 函数 'put' 无法正常工作 - Java

标签 java hashmap

我正在读取 CSV 并将数据保存到对象(为每行创建一个对象)。 CSV 中的行按第一个元素(组号)分组 - 2-10 行之间共享一个组号。数据集中约有 180 个组。为了更轻松地处理这些数据,我将数据存储到 HashMap 中,其中键是组号,与键关联的值是数据对象的 ArrayList。

当我迭代 CSV 的行时,我将对象添加到 HashMap,使用行的组号来告诉将新数据对象放置在哪里。如果该对象具有尚未输入 CSV 的组号,它将创建一个新键(其组号)和一个仅包含其自身的数据对象 ArrayList。

如果行的组号是 HashMap 中的键,它将获取与组号绑定(bind)的 ArrayList,向其中添加新的数据对象,并使用 put 函数使用更新后的 ArrayList 重新添加新条目(现在又多了一个与共享组编号相关的数据条目)。

代码示例:

  ArrayList<CSVData> csvListNew = new ArrayList<CSVData>();
  HashMap<Integer,ArrayList<CSVData>> CSVDataMapNew = new HashMap<Integer,ArrayList<CSVData>>();
  while ((line = reader.readLine()) != null && !(line.contains(",,,,,,,,,"))) 
{
            System.out.println(line);
            String[] csvDataNew = line.split(",");
            String currentGroup = csvDataNew[GroupIndex];
            try {
                currentGroupNumber = Integer.parseInt(currentGroup.replace("group", "").replace(" ", ""));
            } catch (Exception ex) {
                currentGroupNumber = previousGroupNumber;
            }
            String path = csvDataNew[PathIndex];
            startLine = Integer.parseInt(csvDataNew[StartLineIndex]);
            endLine = Integer.parseInt(csvDataNew[EndLineIndex]);

            CSVData data = new CSVData(currentGroupNumber, path, startLine, endLine);

            if (CSVDataMapNew.containsKey(currentGroupNumber)) { //if it does contain the current key, add the current object to the ArrayList tied to it.
                csvListNew = CSVDataMapNew.get(currentGroupNumber);
                csvListNew.add(clone);
                CSVDataMapNew.put(currentGroupNumber, csvListNew);
            } else { //if it doesnt contain the current key, make new entry
                csvListNew.add(clone);
                CSVDataMapNew.put(currentGroupNumber, csvListNew);
                System.out.println(CSVDataMapNew.size());
                System.out.println(CSVDataMapNew.get(currentGroupNumber).size());
            }
            csvListNew.clear(); //to make sure no excess objects are entered into the map.
            previousGroupNumber = currentGroupNumber;
        }

有适当的 try-catch 等,并且 CSVDataTable 在其自己的类中声明,并被静态引用。

问题是,当我在每一步添加打印语句时,就像 HashMap 中的每个 ArrayList 在每个循环结束时都会被删除。因此,一旦 CSV 完成迭代,它就具有每个键值,但与每个键绑定(bind)的 ArrayList 都是空的。 (通过随后循环遍历 HashMap 来证明)。

如何解决这个问题,以便当我在 ArrayList 中输入一个值并将 key 和更新的 ArrayList 重新“放入”Map 时,它会保留其数据?

最佳答案

So once the CSV is finished being iterated through, it has each key value, but the ArrayLists tied to each key are all empty. (

这个

  ArrayList<CSVData> csvListNew = new ArrayList<CSVData>();

应该被调用并关联到 map 的每个键。
但您使用 ArrayList 的单个实例作为映射的每个键的值。

在你的方法结束时,你会:

 csvListNew.clear(); 

因此, map 的所有值都是空的 ArrayList,因为所有值都引用相同的 ArrayList

要解决您的问题,如果映射中不存在该键,您应该创建一个新的 ArrayList 并将其与该键关联:

  ArrayList<CSVData> csvListNew = CSVDataMapNew.get(currentGroupNumber);

  if (csvListNew == null) 
     csvListNew = new ArrayList<CSVData>();
     CSVDataMapNew.put(csvListNew);
  }

然后重用 csvListNew 变量将元素添加到:

 csvListNew.add(clone);

它简化了存在不需要的重复的实际代码。

关于java - HashMap 函数 'put' 无法正常工作 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041871/

相关文章:

java - 将动态值注入(inject) bean 的 constructor-arg 标记

java - 查询HashMap内部实现

java - ConcurrentHashMap 内存开销

java - 从 HashMap 中读取对象内容

java - 如何获取数据库中 Android Java SQL 的最新时间值?

java - 如何使用 AES-256 在 Spring Boot 上设置 SSL (TLS)/HTTPS?

Clojure 如何混合/合并两个 map

java - 将 ArrayList 存储在 HashMap 中

java - JPanels 出现在我创建的每个 GUI 上

java - 为什么我在循环中看不到静态变量?