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