Как вывести на экран значение объекта, используемого интерфейсом Map?

536
28 мая 2017, 20:07

Проблема в том, что не знаю как вывести какой либо объект типа ua.edu.kep.LR_7.StudentInfo. Например, как вывисти на экран максимальный балл всех студентов с карты studentsInfo?

Класс StudentsMap:

    package ua.edu.kep.LR_7;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    public class StudentsMap {
    public static void main(String[] args) {
    Map<String, StudentInfo> studentsInfo = new HashMap<String, StudentInfo>();
    StudentInfo info = new StudentInfo();
    info.setMinimal((float) 7);
    info.setAverage((float) 8.4);
    info.setMaximal((float) 10);
    studentsInfo.put("Вася Пупкін", info);
    info.setMinimal((float) 9);
    info.setAverage((float) 10.1);
    info.setMaximal((float) 11);
    studentsInfo.put("Нехлюй Петро", info);
    info.setMinimal((float) 6);
    info.setAverage((float) 8.6);
    info.setMaximal((float) 10);
    studentsInfo.put("Придорожний Семен", info);
    }
    }

Класс StudentInfo:

package ua.edu.kep.LR_7;
public class StudentInfo {
private float minimal;  
private float average; 
private float maximal;  
public float getMinimal(){
    return minimal;
}
public void setMinimal( float value ){
    minimal = value;
}
public float getAverage(){
    return average;
}
public void setAverage( float value ){
    average = value;
}
public float getMaximal(){
    return maximal;
}
public void setMaximal( float value ){
    maximal = value;
}
}
Answer 1

Во-первый у тебя ошибка при добавлении в Map. Ты всегда используешь info. В результате, ты его переиспользуешь, вместо того, чтобы реально создать три разных объекта StudentInfo. В итоге у тебя в info всегда будут данные только последние что ты добавил. и получится, что все три студента у тебя имеют значения:

6.0
8.6
10.0

чтобы этого не было, надо создавать отдельные объекты для каждого студента. Например, если данные устанавливаются при инициализации (хотя по методам setMinimal/setAverage/setMaximal это и не скажешь), то достаточно объявить конструктор, в который передать параметры инициализации:

public StudentInfo(float min,float avg, float max){
    minimal = min;
    average = avg;
    maximal = max;
}

И тогда данные будут заполняться так:

Map<String, StudentInfo> studentsInfo = new HashMap<String, StudentInfo>();
studentsInfo.put("Вася Пупкін", new StudentInfo(7f, 8.4f, 10f));
studentsInfo.put("Нехлюй Петро", new StudentInfo(9f, 10.1f, 11f));
studentsInfo.put("Придорожний Семен", new StudentInfo(6f, 8.6f, 10f));

Чтобы вывести максимальный балл каждого студента, нужно просто организовать цикл по Map и вывести соответствующие данные с помощью методов get

System.out.println("Максимальный бал студентов: ");
for (Map.Entry<String, StudentInfo> entry : studentsInfo.entrySet()) {
    StudentInfo studentInfo = entry.getValue();
    System.out.println(entry.getKey() + ": " + studentInfo.getMaximal());
}

Если имелось в виду вывести вообще студентов с максимальным баллом, то для этого нужно

  • Найти какой у всех студентов балл максимальный
  • Выбрать по этому признаку студентов.

Пример со стримами Java8:

public static Map<String, StudentInfo> getStudentWithMax(Map<String, StudentInfo> students){
    float maxItem = students.entrySet().stream().map(el -> el.getValue().getMaximal()).max(Float::compareTo).get();
    Map<String, StudentInfo> result = students.entrySet().stream().filter(num -> num.getValue().getMaximal() == maxItem).collect(Collectors.toMap(
            e -> e.getKey(),
            e -> e.getValue()
    ));
    return result;
}
public static void main(String[] args) throws Exception {
    Map<String, StudentInfo> students = new HashMap<String, StudentInfo>();
    students.put("Вася Пупкін", new StudentInfo(7f, 8.4f, 10f));
    students.put("Нехлюй Петро", new StudentInfo(9f, 10.1f, 11f));
    students.put("Придорожний Семен", new StudentInfo(6f, 8.6f, 11f));
    System.out.println("Студенты с максимальным баллом: ");
    Map<String, StudentInfo> studentWithMax = getStudentWithMax(students);
    for (Map.Entry<String, StudentInfo> stringStudentInfoEntry : studentWithMax.entrySet()) {
        System.out.println(stringStudentInfoEntry.getKey());
    }
}

Пример без стримов Java8

public static Map<String, StudentInfo> getStudentWithMax2(Map<String, StudentInfo> students){
    float max = 0f;
    Map<String, StudentInfo> result = new HashMap<>();
    for (Map.Entry<String, StudentInfo> entry : students.entrySet()) {
        StudentInfo studentInfo = entry.getValue();
        if (studentInfo.getMaximal() == max)
            result.put(entry.getKey(), studentInfo);
        if (studentInfo.getMaximal() > max) {
            max = studentInfo.getMaximal();
            result.clear();
            result.put(entry.getKey(), studentInfo);
        }
    }
    return result;
}
public static void main(String[] args) throws Exception {
    Map<String, StudentInfo> students = new HashMap<String, StudentInfo>();
    students.put("Вася Пупкін", new StudentInfo(7f, 8.4f, 10f));
    students.put("Нехлюй Петро", new StudentInfo(9f, 10.1f, 11f));
    students.put("Придорожний Семен", new StudentInfo(6f, 8.6f, 11f));
    System.out.println("Студенты с максимальным баллом: ");
    Map<String, StudentInfo> studentWithMax = getStudentWithMax2(students);
    for (Map.Entry<String, StudentInfo> stringStudentInfoEntry : studentWithMax.entrySet()) {
        System.out.println(stringStudentInfoEntry.getKey());
    }
}
READ ALSO
Какая логика приложение на Android, психологического теста?

Какая логика приложение на Android, психологического теста?

Здравствуйте! Вопрос очень абстрактный, я это понимаю и ответ естественно жду примерно такой же

248
Как в тексте заменить символ перевода строки на другой?

Как в тексте заменить символ перевода строки на другой?

Есть компонент TextEdit, в котором набирается текстНабранный текст надо поместить в одну строку, а признаки перевода строки заменить на какие...

324
Помогите улучшить код написанный на java

Помогите улучшить код написанный на java

есть структуры которых уже больше 2 десятковпомогите улучшить код

258
Тестирование URI

Тестирование URI

Здравствуйте! Есть класс-роутер, который проверяет URI и на его основании составляет внутренний маршрут в системеСтолкнулся с проблемой при...

269