java - 添加通过while循环在hashmap中但不工作
问题描述
我有以下 CSV 文件,我想创建一个哈希图,其唯一键应该是每行的第一个值,值应该是arraylist
包含该行第一个值下的每一行的信息。CSV 示例如下:
1,0
1,1
1,2
1,3
1,4
2,0
2,1
2,2
4,0
10,0
10,1
10,2
10,3
10,4
10,5
所以理想情况下,我希望最终的 ArrayList 类似于:
{1=[1,0, 1,1, 1,2, 1,3, 1,4], 2=[2,0, 2,1, 2,2], 4=[4,0], 10=[10,0, 10,1, 10,2, 10,3, 10,4, 10, 5]}
下面是我用来尝试通过while循环解决这个问题的代码
public static void main(String[] args) {
int activityRecord = 1;
String activitiesFile = "scenarios/BrusselsPopulationFromR/BrusselsActivities.csv";
HashMap<Integer, ArrayList<String>> idAndAllActivities = new HashMap<>();
try {
BufferedReader activityReader = new BufferedReader(new FileReader(activitiesFile));
String agentActivity = null;
ArrayList activities = new ArrayList();
while ((agentActivity = activityReader.readLine()) != null){
String activityWithAllInfo = agentActivity;
String[] activitySpilted = agentActivity.split(",");
int activityAgentID = Integer.parseInt(activitySpilted[0]);
if (activityAgentID == activityRecord){
activities.add(activityWithAllInfo);
} else if (activityAgentID != activityRecord){
idAndAllActivities.put(activityRecord, activities);
activityRecord = activityAgentID;
activities.clear();
activities.add(activityWithAllInfo);
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(idAndAllActivities);
}
基本上,我试图证明是否activityAgentID == activityRecord
(最初为1),如果不同,我会将<K,V>添加到hashmap并清除activities
arrayList。然而,这个程序的输出是这样的:
{1=[10,0, 10,1, 10,2, 10,3, 10,4, 10,5], 2=[10,0, 10,1, 10,2, 10,3, 10,4, 10,5], 4=[10,0, 10,1, 10,2, 10,3, 10,4, 10,5]}
这不是我想要的,我试图调试它,但我找不到原因,因为我对 Java 真的很陌生......我想知道你是否知道如何解决这个问题?任何提示将不胜感激!
谢谢!
解决方案
您的代码中的问题是您重用了activities
数组。活动数组和在 all 中分配的那些HashMap
都指向同一个引用,所以如果你更新activities
数组,地图中的所有条目也将被更新。
假设文件有键排序,你可以调整你的代码有点像这样
HashMap<Integer, ArrayList<String>> idAndAllActivities = new HashMap<>();
try {
BufferedReader activityReader = new BufferedReader(new FileReader(activitiesFile));
String agentActivity = null;
ArrayList<String> activities = new ArrayList<>();
while ((agentActivity = activityReader.readLine()) != null){
String[] activitySpilted = agentActivity.split(",");
int activityAgentID = Integer.parseInt(activitySpilted[0]);
if (activityAgentID == activityRecord){
activities.add(agentActivity);
} else {
idAndAllActivities.put(activityRecord, activities);
activityRecord = activityAgentID;
activities = new ArrayList<>();
activities.add(agentActivity);
}
}
idAndAllActivities.put(activityRecord, activities);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(idAndAllActivities);
请注意,您不需要这个:String activityWithAllInfo = agentActivity;
因为String
在 Java 中是不可变的
推荐阅读
- android - Mapbox SDK - onMilestoneEvent 根本不会触发 + 无法设置自定义里程碑
- hive - Hive 视图 - 未列出分区
- module - 为导出的谓词重新定义模块中的运算符优先级
- kotlin - 在 Kotlin 中有效地查看(或复制)大型 HashMap 的子集
- c# - 将数据流式传输到 .csv 不显示结果 C#
- android - SQLite 查询以选择一行并将其与 2 下一行一起返回
- sql - 链接服务器未显示在数据库列表中
- java - Spring Boot - JSP 不显示列表?
- asp.net-core - 食人鱼 cms 与 MySql
- java - Java 原始类型案例中的显式类型转换