Java
Map의 정렬
낙타선생
2020. 11. 28. 09:27
반응형
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;
}
}
실행결과