我正在尝试存储一个具有多个值的键。首先,我读取文本文件中的一些字符串,然后分割并最后尝试存储。 问题是,当我尝试存储每个学生的类(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/