树图中重复键的值会发生什么变化

时间:2015-05-08 00:17:08

标签: java treemap

我有一个文本文件,可以读入树形图。文本文件包含学生及其标记的列表。

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

3 个答案:

答案 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