자바 hashmap의 객체 value 정렬

자바 hashmap의 객체 value 정렬

작성일 2020.11.09댓글 1건
    게시물 수정 , 삭제는 로그인 필요

Student라는 클래스에 student_id, name, grade_point 의 인스턴스가 있고,

HashMap<String, Student> hashmap_student = new HashMap<String, Student>();
라고 선언을 하고, 

hashmap_student.put(student_id, new Student(student_id, name, grade_point));

10개의 값을 위의 코딩으로 넣었습니다.

근데 Student의 student_id를 검색을 하는 것과 grade_point를 내림차순으로 정렬할려고 하는데

key 값이 student_id 가 있어서 student_id 검색은 되는데, 

grade_point를 정렬하려고 하니 어떻해야 할지 모르겠습니다.

알려주세요ㅜㅜ



profile_image 익명 작성일 -

기본적으로 Map은 정렬할 수가 없는 구조입니다. LinkedHashMap을 사용하실 경우 입력한 순서대로 키 값이 저장될 순 있습니다.

현재 id, student 형태로 맵에 저장되어있기 때문에 value만 추출하여 list 형태로 만든 뒤 점수로 정렬하셔야 합니다.

그리고 객체지향적으로 코딩하려면 Student 클래스가 Comparable을 구현하고, 위에서 추출한 list에서 sort를 호출해주는 것이 바람직합니다.

자바에서는 상수를 제외하고는 언더스코어(밑줄, "_")를 사용하지 않습니다.

아래는 Student 클래스에서 Comparable을 구현하고 map에서 value만 꺼내 정렬하여 리스트로 추린 것 입니다.

import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { Map<String, Student> studentMap = new HashMap<>(); // 중간에 StudentMap에 입력했다고 가정 Collection<Student> values = studentMap.values(); List<Student> sortedStudents = values.stream().sorted().collect(Collectors.toList()); System.out.println(sortedStudents); } } class Student implements Comparable<Student> { private String studentId; private String name; private float gradePoint; public Student(String studentId, String name, float gradePoint) { this.studentId = studentId; this.name = name; this.gradePoint = gradePoint; } public String getStudentId() { return studentId; } public String getName() { return name; } public float getGradePoint() { return gradePoint; } @Override public int compareTo(Student o) { int gradeComparison = Float.compare(o.gradePoint, this.gradePoint); // 점수 내림차순 정렬 return gradeComparison == 0 ? studentId.compareTo(o.studentId) : gradeComparison; // 점수가 동률일 때 아이디 기준 오름차순 정렬 } }

Student 클래스에서 Comparable을 구현하지 않는다면 아래처럼 스트림과 Comparator를 이용하여 구현하셔도 됩니다.

import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { // 생략 List<Student> students = studentMap.values() .stream() .sorted(Comparator .comparing(Student::getGradePoint).reversed() // 성적 내림차순 .thenComparing(Student::getStudentId)) // 그 이후 아이디 오름차순 .collect(Collectors.toList()); System.out.println(students); } } class Student { private String studentId; private String name; private float gradePoint; public Student(String studentId, String name, float gradePoint) { this.studentId = studentId; this.name = name; this.gradePoint = gradePoint; } public String getStudentId() { return studentId; } public String getName() { return name; } public float getGradePoint() { return gradePoint; } }

자바 HashMap에 대해 질문이 있습니다.

HashMap<K, V>일때, Key와 Value가 둘다 로컬 클래스이면, Key안에 있는 변수를... (로컬 클래스 가 들어갈수도있음) 따라서 K(key) 값에 객체나 클래스는...

자바 HashMap에서 value값을 가지고...

key를 알면 value를 매칭시키는게 HashpMap이잖아요... 순서대로 정렬시키려 하거든요 즉,,, 최종적으로는... 합니다 자바에서 어떻게 접근할 수 있을까요??? 원본...

자바hashmap질문입니다.

... int value = entry.getValue(); ..... } 문제는, HashMap은 입력순서가 보장이... 로 key를 먼저 정렬하고, for (String key : keyList) { int value = map.get(key); .....

안녕하세요 자바 HashMap 질문이...

... new HashMap<Integer,String>(); for(int i=0; i<msg.length;i++) { map.put(i, msg[i]); } //저장된 key, value 목록... map 객체에서 key만 가져옵니다. key는 unique...

자바 java HashMap 검색

... ㅎㅎ HashMap<String, Unit> unitInfo = new HashMap<String, Unit>(); // HashMap 안에 <key... <key(String), value(객체)> 가 되어버리니까.......객체 안의 변수를...