Как правильно сохранить в hashmap, а затем скопировать в древовидную карту, чтобы зациклить и отобразить ключ и значения - PullRequest
1 голос
/ 06 ноября 2019

Я сохраняю пользовательский ввод в хэш-карту, затем использую его для построения из него Treemap, а затем перебираю и отображаю ключи / значения внутри. Вместо этого мне удается только сохранить / отобразить 2 самые последние введенные данные пользователя.

import java.util.Scanner;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.Map;

public class Lab09 {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        int studentNbr = 0;
        int scoreNbr = 0;
        String name = "";

        HashMap<String, Integer> students = new HashMap<String, Integer>();


        System.out.println("How many students do you want to enter?");
        studentNbr = input.nextInt();
        input.nextLine();

        System.out.println("How many scores do you want to enter for each student?");
        scoreNbr = input.nextInt();
        input.nextLine();

        for(int i = 0; i < studentNbr; i++){
            System.out.println("Enter student number " + (i+1) + " name:");
            name = input.nextLine();
            int j = 0;
            while(j < scoreNbr){
                System.out.println("Enter score " + (j+1) + " for " + name + ":");
                students.put(name, input.nextInt());
                input.nextLine();
                j++;
            }

        }
        Map<String, Integer> sorted = new TreeMap<String, Integer>(students);
        for (String i : sorted.keySet()) {
            System.out.println("key: " + i + " value: " + sorted.get(i));
        }

    }
}

Я ожидаю, что смогу отобразить все ключи / значения, но вместо этого получу только 2 строки, отображающие самый последний пользовательский ввод вместо всех данных, введенных пользователем.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

HashMap в java заменит предыдущее значение на новое значение, если ключ такой же. Вы можете создать составной ключ для карты «студентов» с именем студента и идентификатором счета. например,

  students.put(name+'-'+j, input.nextInt());
1 голос
/ 06 ноября 2019

Вы также можете использовать список оценок в качестве значения. И вы можете непосредственно использовать TreeMap на первом месте без необходимости определять два экземпляра карты. Вот соответствующий код:

    Map<String, List<Integer>> students = new TreeMap<>();        

    for(int i = 0; i < studentNbr; i++){
        System.out.println("Enter student number " + (i+1) + " name:");
        name = input.nextLine();
        int j = 0;
        while(j < scoreNbr){
            System.out.println("Enter score " + (j+1) + " for " + name + ":");
            students.putIfAbsent(name, new ArrayList<>());
            students.get(name).add(input.nextInt());
            input.nextLine();
            j++;
        }
    }
...