java - HashMap 更新与最后一项有关的所有值

标签 java hashmap

我正在尝试存储一个具有多个值的键。首先,我读取文本文件中的一些字符串,然后分割并最后尝试存储。 问题是,当我尝试存储每个学生的类(class)时,我的 StudentByForCourseName HashMap 每次都会更新最后添加项的所有值(类(class))。所以,看起来每个学生都与上一个学生学习相同的类(class)在我的 map 中。我该如何解决这个问题?

List<String> course_names = new ArrayList<String>();
    Map<String, List<String>> studentByForCourseName = new HashMap<String, List<String>>(); 


      ...  try {
            FileReader fr = new FileReader(file);
            br = new BufferedReader(fr);

            String line;

            while( (line = br.readLine()) != null ) {
                System.out.println(line);
                char[] chr_line = line.toCharArray();
                String word="";
                String tmp = "";

                if(course_names.size()>0)        
                        course_names.clear();

                for(int i=0; i<chr_line.length; i++) {

                    if(chr_line[i] == ':') {
                        student_names.add(word);
                        tmp = word;
                        word = "";
                        continue;
                    }

                   if( chr_line[i] == ',') {
                       course_names.add(word);
                        word = "";
                        continue;
                    }

                   if(i == line.length()-1) {
                       course_names.add(word);
                       word="";
                   }

                   word += chr_line[i];


                }

                studentByForCourseName.put(tmp, course_names);
            }...

我的txt文件是:

Ayse Kara:MATH101,CSE100,MATH259
Efe Anıl:BLAW203,MATH101
Suat Ali Barut:STAT253,MATH259
Nil Girgin:MATH259,HIST111,STAT253

最佳答案

当你打电话时

studentByForCourseName.put(tmp, course_names);

您没有放置 course_names 引用的实例的副本在 Map 。您正在放置引用本身。

因此,如果course_names继续引用相同的ArrayList<String>实例(就像目前的情况一样), Map 中的所有键将具有相同的值。

您应该创建一个新的 ArrayList在循环的每次迭代中。

改变

if(course_names.size()>0)        
    course_names.clear();

course_names = new ArrayList<> ();

另一种选择(而不是上述建议的更改)是创建 ArrayList 的副本当你 put它在 Map :

studentByForCourseName.put(tmp, new ArrayList<>(course_names));

关于java - HashMap 更新与最后一项有关的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47812722/

相关文章:

java - 如何将 Hashmap 存储到 android,以便在使用共享首选项重新启动应用程序时重用它?

java - 如果将 TreeMap 作为 Map 传递给它,Treemap 会使用吗

java "generic generic type"

java - 使用 getString(R.string.my_string) 搜索 map

java - 从 ATM 机取钱

java - 在java中获取hashmap中的最高值

java - 如何以 Java 方式直接从设备读取/写入文件(如 O_DIRECT 标志的效果)?

java - 如何保证action类中数据的完整性

java - HashMap 中的 1 对 1 映射

java - 具有弱引用的 ConcurrentHashmap