HashMap函数';把';工作不正常-Java

HashMap函数';把';工作不正常-Java,java,hashmap,Java,Hashmap,我正在读取CSV并将数据保存到对象(为每行创建一个对象)。CSV中的行按第一个元素(组号)分组-2-10ish行之间的某个位置共享一个组号。数据集中约有180组。为了更容易地处理这些数据,我将数据存储到HashMaps中,其中键是组号,绑定到键的值是数据对象的ArrayList 当我遍历CSV的行时,我将对象添加到HashMap中,使用行的组号告诉新数据对象的放置位置。如果对象有一个尚未输入CSV的组号,它将创建一个新键(其组号)和一个数据对象的ArrayList,其中只包含它自己 如果行的组号

我正在读取CSV并将数据保存到对象(为每行创建一个对象)。CSV中的行按第一个元素(组号)分组-2-10ish行之间的某个位置共享一个组号。数据集中约有180组。为了更容易地处理这些数据,我将数据存储到HashMaps中,其中键是组号,绑定到键的值是数据对象的ArrayList

当我遍历CSV的行时,我将对象添加到HashMap中,使用行的组号告诉新数据对象的放置位置。如果对象有一个尚未输入CSV的组号,它将创建一个新键(其组号)和一个数据对象的ArrayList,其中只包含它自己

如果行的组号是HashMap中的一个键,它将获取绑定到组号的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;
        }
ArrayList csvListNew=new ArrayList();
HashMap CSVDataMapNew=新HashMap();
而((line=reader.readLine())!=null&&!(line.contains(“,,,,,,,,”))
{
系统输出打印项次(行);
字符串[]csvDataNew=line.split(“,”);
字符串currentGroup=csvDataNew[GroupIndex];
试一试{
currentGroupNumber=Integer.parseInt(currentGroup.replace(“组”),replace(“,”);
}捕获(例外情况除外){
currentGroupNumber=以前的GroupNumber;
}
字符串路径=csvDataNew[PathIndex];
startLine=Integer.parseInt(csvDataNew[StartLineIndex]);
endLine=Integer.parseInt(csvDataNew[EndLineIndex]);
CSVData数据=新CSVData(currentGroupNumber、path、startLine、endLine);
如果(CSVDataMapNew.containsKey(currentGroupNumber)){//如果它确实包含当前键,则将当前对象添加到绑定到它的ArrayList中。
csvListNew=CSVDataMapNew.get(currentGroupNumber);
csvListNew.add(克隆);
CSVDataMapNew.put(currentGroupNumber,csvListNew);
}否则{//如果它不包含当前键,则创建新条目
csvListNew.add(克隆);
CSVDataMapNew.put(currentGroupNumber,csvListNew);
System.out.println(CSVDataMapNew.size());
System.out.println(CSVDataMapNew.get(currentGroupNumber.size());
}
csvListNew.clear();//确保没有多余的对象输入到地图中。
previousGroupNumber=当前GroupNumber;
}
有适当的try捕获等,CSVDataTable在其自己的类中声明,静态引用


问题是,当我在每个步骤中添加print语句时,它就像HashMap中的每个ArrayList在每个循环结束时被擦除一样。因此,一旦完成对CSV的迭代,它就拥有每个键值,但是绑定到每个键值的ArrayList都是空的。(随后通过HashMap循环进行证明)

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

因此,一旦完成对CSV的迭代,它就拥有了每个键 值,但绑定到每个键的ArrayList都为空。(

这个

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

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

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

  if (csvListNew == null) 
     csvListNew = new ArrayList<CSVData>();
     CSVDataMapNew.put(csvListNew);
  }
它简化了具有不希望的重复的实际代码

因此,一旦完成对CSV的迭代,它就拥有了每个键 值,但绑定到每个键的ArrayList都为空(

这个

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

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

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

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

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

始终将相同的
ArrayList
实例作为值放入
HashMap
中。这是在循环之前创建的
ArrayList
实例,由
csvListNew
变量引用

这意味着当您调用
csvListNew.clear()
时,您将清除
HashMap
的所有
ArrayList

这可以通过每次在
HashMap
中添加新条目时创建一个新的
数组列表来解决:

        if (CSVDataMapNew.containsKey(currentGroupNumber)) {
            csvListNew = CSVDataMapNew.get(currentGroupNumber);
            csvListNew.add(clone);
        } else {
            csvListNew = new ArrayList<>(); // that's the main required fix
            csvListNew.add(clone);
            CSVDataMapNew.put(currentGroupNumber, csvListNew);
            System.out.println(CSVDataMapNew.size());
            System.out.println(CSVDataMapNew.get(currentGroupNumber).size());
        }
if(CSVDataMapNew.containsKey(currentGroupNumber)){
csvListNew=CSVDataMapNew.get(currentGroupNumber);
csvListNew.add(克隆);
}否则{
csvListNew=new ArrayList();//这是所需的主要修复
csvListNew.add(克隆);
CSVDataMapNew.put(currentGroupNumber,csvListNew);
System.out.println(CSVDataMapNew.size());
System.out.println(CSVDataMapNew.get(currentGroupNumber.size());
}

此外,删除
csvListNew.clear()
调用。

始终将相同的
ArrayList
实例作为值放入
HashMap
中。这是在循环之前创建的
ArrayList
实例,由
csvListNew
变量引用

这意味着当您调用
csvListNew.clear()
时,您将清除
HashMap
的所有
ArrayList

这可以通过每次在
HashMap
中添加新条目时创建一个新的
数组列表来解决:

        if (CSVDataMapNew.containsKey(currentGroupNumber)) {
            csvListNew = CSVDataMapNew.get(currentGroupNumber);
            csvListNew.add(clone);
        } else {
            csvListNew = new ArrayList<>(); // that's the main required fix
            csvListNew.add(clone);
            CSVDataMapNew.put(currentGroupNumber, csvListNew);
            System.out.println(CSVDataMapNew.size());
            System.out.println(CSVDataMapNew.get(currentGroupNumber).size());
        }
if(CSVDataMapNew.containsKey(currentGroupNumber)){
csvListNew=CSV
        if (CSVDataMapNew.containsKey(currentGroupNumber)) {
            csvListNew = CSVDataMapNew.get(currentGroupNumber);
            csvListNew.add(clone);
        } else {
            csvListNew = new ArrayList<>(); // that's the main required fix
            csvListNew.add(clone);
            CSVDataMapNew.put(currentGroupNumber, csvListNew);
            System.out.println(CSVDataMapNew.size());
            System.out.println(CSVDataMapNew.get(currentGroupNumber).size());
        }
    Map<Integer,List<CSVData>> CSVDataMapNew = new HashMap<>();
    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)) { 
            CSVDataMapNew.get(currentGroupNumber).add(clone);
        } else { 
            ArrayList<CSVData> csvListNew = new ArrayList<CSVData>();
            CSVDataMapNew.put(currentGroupNumber, csvListNew);
            csvListNew.add(clone);
        }
        previousGroupNumber = currentGroupNumber;
    }