-
[Java]순서가 존재하지 않는 Map을 정렬하기usage 2022. 8. 11. 12:52
자료구조 Map은 List와 달리 순서가 존재하지 않는다. 하지만 상황에 따라서 Map을 특정기준(key 혹은 value)에 따라 정렬해야되는 상황이 존재 할 수 있다. 이번 포스팅은 Map를 정렬하는 방법에 대해서 포스팅한다.
- 구현코드는 여기에 저장되어 있다.
Map이 sort되는 과정
Map이 sort되기 위해서는 아래와 같은 과정이 필요하다.
1.Map를 List로 변환하기
Map은 개념상 순서를 보장하지 않는 자료구조이기 때문에 Map인터페이스에는 순서와 관련 된 메소드를 지원하지 않는다. 그러므로 Map을 List형으로 변환시켜줘야한다. Map은 Entry라는 Inner클래스를 가지고 있는데 해당 Inner클래스를 타입파라미터로 정의하여 List로 변환 할 수 있다.
2.List를 sort하기 위한 Comparator 정의하기
List 컬렉션은 sort()메소드를 지원한다. sort메소드를 사용하기 위해서는 Comparator클래스를 정의하여야 한다. Comparator의 사용법에 대해서는 여기를 참조하기 바란다.
3.Comparator 객체 주입하여 sort하기
List의 sort()메소드는 전략패턴으로 구현되어있어 Comparator클래스의 객체를 생성한 후, sort메소드에 객체를 주입해줘야 한다.
오름차순으로 구현
오름차순으로 구현하는 경우 2번의 과정을 생략하고 Map.Entry.comparingByValue()를 호출하여 Comparator객체를 반환 받을 수 있다. 만약 key를 기준으로 정렬하고 싶다면 Map.Entry.comparingByKey()를 호출하면 된다.
... private static List sortMap(Map map){ List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet()); list.sort(Map.Entry.comparingByValue()); return list; } ...
내림차순으로 구현
만약 내림차순으로 구현하고 싶다면 Comparator를 정의하여 객체생성 후 주입해주어야 하는데 두가지 방법을 소개한다.
익명객체(anonymous object) 사용
첫번째로 익명객체를 사용하는 것이다. 아래의 소스코드를 보면 sort()메소드에 파라미터로 익명객체를 주입해주었다.
private static List customSortMapUsingAnonymousObj(Map map){ List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet()); list.sort(new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue() - o1.getValue(); } }); return list; }
람다(lambda) 사용
두번째로 람다식을 사용하는 것이다. 아래의 소스코드를 보면 sort()메소드에 람다식을 주입해주었다.
private static List customSortMapUsingLambda(Map map){ List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet()); list.sort( (o1, o2) -> o2.getValue() - o1.getValue() ); return list; }
익명객체 vs 람다
사실 람다식을 주입해도 Java 내부적으로는 익명객체가 생성되는 것이므로 성능상 차이는 없다. 다만 람다식은 코드가 조금 더 간결해 보인다는 장점이 있다. 둘 중 어느것을 사용할지는 개발자 본인이 더 편한 방법을 선택하면 될거 같다.
결과확인
아래와 같이 메소드를 호출해보면 결과를 확인 할 수 있다.
public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("a", 3); map.put("b", 2); map.put("c", 1); map.put("c", 5); map.put("c", 6); map.put("c", 9); List list = sortMap(map); System.out.println(list.toString()); List list1 = customSortMapUsingAnonymousObj(map); System.out.println(list1); List list2 = customSortMapUsingLambda(map); System.out.println(list2); } ---실행결과--- [c=1, b=2, a=3, d=5, e=6, f=9] [f=9, e=6, d=5, a=3, b=2, c=1] [f=9, e=6, d=5, a=3, b=2, c=1]
'usage' 카테고리의 다른 글
[Spring] Interceptor를 이용한 인증시스템 구현 (0) 2022.08.04 [DataStructure]큐(Queue)란? (0) 2022.08.04 버블정렬이란? (0) 2022.07.30