通过while循环在hashmap中但不工作,java,arraylist,hashmap"/>

首页 > 解决方案 > 添加通过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并清除activitiesarrayList。然而,这个程序的输出是这样的:

{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 真的很陌生......我想知道你是否知道如何解决这个问题?任何提示将不胜感激!

谢谢!

标签: javaarraylisthashmap

解决方案


您的代码中的问题是您重用了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 中是不可变的


推荐阅读