-
반응형
key 기준으로 자동정렬 되는 Map 타입들
HashMap, TreeMap은 entry를 추가할 때마다 key를 기준으로 오름차순 정렬되어 저장된다.
public class Exam { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); //Map<String, String> map = new TreeMap<>(); map.put("3", "Dave"); map.put("1", "Mike"); map.put("4", "John"); map.put("2", "Judy"); for(Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } } }
실행결과
entry의 순서가 추가한 순서대로 저장되길 원한다면 LinkedHashMap을 사용한다.
public class Exam { public static void main(String[] args) { Map<String, String> map = new LinkedHashMap<>(); map.put("3", "Dave"); map.put("1", "Mike"); map.put("4", "John"); map.put("2", "Judy"); for(Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } } }
실행결과
추가한 entry 순서가 보장되도록 하기 원하면 LinkedHashMap<E> 타입을 사용한다.
Key를 기준으로 정렬하기
import java.util.*; public class Exam { public static void main(String[] args) { Map<String, String> map = new LinkedHashMap<>(); map.put("3", "Dave"); map.put("1", "Mike"); map.put("4", "John"); map.put("2", "Judy"); System.out.println("=========== Origin Data ============"); for(Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } System.out.println("=====================================\n"); LinkedHashMap<String, String> resultAsc = sortMapByKey(map, 0); System.out.println("====== Sorted Data order by ASC ====="); for(Map.Entry<String, String> entry : resultAsc.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } System.out.println("=====================================\n"); LinkedHashMap<String, String> resultDesc = sortMapByKey(map, 1); System.out.println("===== Sorted Data order by DESC ====="); for(Map.Entry<String, String> entry : resultDesc.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } System.out.println("====================================="); } public static LinkedHashMap<String, String> sortMapByKey(Map<String, String> map, Integer orderBy) { /*** * Sort Map type data by key * @param map - unsorted Map type data [target] * @param orderBy - 0: ASC, 1: DESC * @return sorted LinkedHashMap type data by key. */ List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet()); // ① if(orderBy == 0) { Collections.sort(entries, (o1, o2) -> o1.getKey().compareTo(o2.getKey())); // ② } else { Collections.sort(entries, (o1, o2) -> o2.getKey().compareTo(o1.getKey())); } LinkedHashMap<String, String> result = new LinkedHashMap<>(); // ③ for (Map.Entry<String, String> entry : entries) { result.put(entry.getKey(), entry.getValue()); } return result; } }
① 정렬을 위해 연결리스트를 사용하기 때문에 정렬할 Map 타입 객체의 entry set을 연결리스트에 넣어준다.
② Collections.sort() 메서드 첫번째 인자는 ①에서 만든 연결리스트를 두번째 인자로는 comparator 객체를 넣어준다. 여기서는 람다식을 사용하여 comparator 객체를 생성했다. 이 메서드가 실행되면 연결리스트의 내용이 정렬된다.
③ 정렬된 결과를 저장할 LinkedHashMap 타입 객체를 만들고 연결리스트의 내용을 넣은 후 반환한다.
실행결과
Value를 기준으로 정렬하기
import java.util.*; public class Exam { public static void main(String[] args) { Map<String, String> map = new LinkedHashMap<>(); map.put("3", "Dave"); map.put("1", "Mike"); map.put("4", "John"); map.put("2", "Judy"); System.out.println("=========== Origin Data ============"); for(Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } System.out.println("=====================================\n"); LinkedHashMap<String, String> resultAsc = sortMapByValue(map, 0); System.out.println("====== Sorted Data order by ASC ====="); for(Map.Entry<String, String> entry : resultAsc.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } System.out.println("=====================================\n"); LinkedHashMap<String, String> resultDesc = sortMapByValue(map, 1); System.out.println("===== Sorted Data order by DESC ====="); for(Map.Entry<String, String> entry : resultDesc.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } System.out.println("====================================="); } public static LinkedHashMap<String, String> sortMapByValue(Map<String, String> map, Integer orderBy) { /*** * Sort Map type data by value * @param map - unsorted Map type data [target] * @param orderBy - 0: ASC, 1: DESC * @return sorted LinkedHashMap type data by value. */ List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet()); if(orderBy == 0) { Collections.sort(entries, (o1, o2) -> o1.getValue().compareTo(o2.getValue())); } else { Collections.sort(entries, (o1, o2) -> o2.getValue().compareTo(o1.getValue())); } LinkedHashMap<String, String> result = new LinkedHashMap<>(); for (Map.Entry<String, String> entry : entries) { result.put(entry.getKey(), entry.getValue()); } return result; } }
실행결과
'Java' 카테고리의 다른 글
문자열 뒤집기 예제 (0) 2020.12.10 형변환 (type casting) (0) 2020.12.04 라이브러리를 사용한 배열 정렬 (0) 2020.11.30 Collection Framework (0) 2020.11.24 콘솔 입력 (0) 2020.10.08