我有一个文本文件,可以读入树形图。文本文件包含学生及其标记的列表。
Harry 10
Sam 8
John 7
Harry 8
Sam 9
我尝试编写此代码,该代码读取文件,将其存储在树形图中并在控制台上显示。
Scanner scanner = new Scanner(new FileReader("marks.txt"));
TreeMap<String, Integer> students = new TreeMap<String, Integer>();
while (scanner.hasNextLine()) {
String[] columns = scanner.nextLine().split("\\s+");
students.put(columns[0], Integer.parseInt(columns[1]));
}
System.out.println("Alpha Order");
// Iterate over TreeMap
for (String key : students.keySet()) {
System.out.println(key + " :: " + students.get(key));
}
执行代码后我在控制台上获得的输出是
Alpha Order
Harry :: 10
John :: 7
Sam :: 9
我需要其他值进行进一步的计算。是否有可能有像
这样的输出Harry :: 10 8
John :: 7
Sam :: 9 8
答案 0 :(得分:1)
树形图中重复键的值会发生什么变化
替换重复键的旧值。如果Map
发现密钥已存在,则替换该值。 E.g。
"Harry" => 10
变为
"Harry" => 8
是否可以输出
是的,但您需要保留List<Integer>
作为您的价值。
而不是盲目地put
键/值对,测试密钥是否已存在containsKey
。如果密钥已存在,则get
列表和add
值。如果该密钥尚不存在,则创建一个新的List
,将值添加到其中,然后将put
键/值添加到Map
。
E.g。
"Harry" => [10]
到
"Harry" => [10, 8]
答案 1 :(得分:0)
地图确实如此;它从一个键映射到一个值。
因此,当您阅读Harry的第二个输入时,它将替换之前的值。
如果您需要映射到多个值,您可以将地图从名称映射到整数集合。
例如:
Map<String, List<Integer>> map = new TreeMap<>();
//...
if(map.containsKey(name) == false)
map.put(name, new LinkedList<Integer>());
map.get(name).add(score);
答案 2 :(得分:0)
正如其他人所指出的那样,值将被替换,因为Map只允许一个键 - &gt;价值映射。
将多个值映射到键的最简单方法是使用多(值)映射。我更喜欢Guava:
Scanner scanner = new Scanner(new FileReader("marks.txt"));
TreeMultimap<String, Integer> students = TreeMultimap.create();
while (scanner.hasNextLine()) {
String[] columns = scanner.nextLine().split("\\s+");
students.put(columns[0], Integer.parseInt(columns[1]));
}
System.out.println("Alpha Order");
// Iterate over TreeMap
for (String key : students.keySet()) {
System.out.println(key + " :: " + String.join(", ", students.get(key)));
}
但是,如果您无法添加依赖项,则可以使用TreeMap<String, TreeSet<Integer>>
:
Scanner scanner = new Scanner(new FileReader("marks.txt"));
TreeMap<String, TreeSet<Integer>> students = new TreeMap<>();
while (scanner.hasNextLine()) {
String[] columns = scanner.nextLine().split("\\s+");
String student = columns[0];
TreeSet<Integer> set;
if(students.containsKey(student)) {
// A set already exists in the map for this student,
// append to it
set = students.get(student);
} else {
// No set exists in the map for this student,
// create a new one and put it in the map
set = new TreeSet<>();
students.put(student, set);
}
set.add(Integer.parseInt(columns[1]));
}
System.out.println("Alpha Order");
// Iterate over TreeMap
for (String key : students.keySet()) {
System.out.println(key + " :: " + String.join(", ", students.get(key)));
}
请注意,这两个是使用集合,因此不会允许重复键 - &gt;价值映射。即你不能得到这个输出:
Harry :: 10 8 8
John :: 7 7
Sam :: 9 9 8
使用后一种解决方案很容易实现,只需将TreeSet
替换为ArrayList
。