HANDA개발
HANDA개발공부
HANDA개발
전체 방문자
오늘
어제
  • HANDA_list
    • 취업일지
    • 일상
    • TIL
    • Linux
    • RabbitMQ
    • Spring
      • Security
      • Batch
      • Project
    • ERROR
    • DB
      • Oracle
      • PostgreSQL
    • JUnit
    • JAVA
    • AWS
    • OAuth2.0
    • Redis
    • API
    • Jenkins
    • Nigix
    • CS
    • 코테준비
      • 자료구조
      • 알고리즘
    • 학교수업
    • 디자인패턴

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • mybatis
  • 애플코딩
  • 프로시져호출
  • garbaage
  • 다른파라미터
  • 프로그래머스
  • MQ
  • Spring
  • Parameter
  • 재실행
  • oracle
  • batch
  • EAI
  • 상태관리
  • cmd
  • JAVA명령어
  • SpringBatch
  • 역직렬화
  • @Valid
  • 어노테이션
  • gson
  • java실행과정
  • valid어노테이션
  • JVM
  • 데이터베이스
  • 스프링배치
  • error
  • 명령어
  • Job
  • 공부준비

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HANDA개발
TIL

Java - HashMap 정렬, 4가지 방법

TIL

Java - HashMap 정렬, 4가지 방법

2023. 4. 10. 17:31
codechacha.comhttps://codechacha.com/ko/java-sort-map/#4-linkedhashmap%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-hashmap-%EC%A0%95%EB%A0%AC
 

Java - HashMap 정렬, 4가지 방법

JAVAEXAMPLES

자바에서 HashMap 또는 Map을 정렬(sorting)하는 다양한 방법을 소개합니다.

HashMap은 입력하는 데이터의 순서를 보장하지 않는 자료구조입니다. 그렇기 때문에 다른 자료구조를 이용하여 HashMap의 요소들을 정렬해야 합니다.

  • 1. List를 이용하여 HashMap 정렬
  • 2. TreeMap을 이용하여 HashMap 정렬
  • 3. Stream을 이용하여 HashMap 정렬
  • 4. LinkedHashMap을 이용하여 HashMap 정렬
  • References

1. List를 이용하여 HashMap 정렬

keySet() 또는 values()는 HashMap에 저장된 모든 key와 value들을 List로 리턴합니다.

리스트는 순서가 있는 자료구조이기 때문에, key 또는 value에 대한 리스트를 원하는 방식으로 정렬할 수 있습니다. 만약 key 또는 value 중에 한 종류만 정렬이 필요한 경우, 이 방법을 사용하시면 됩니다.

1.1 Key로 정렬(Sort by key)

다음 코드는 key가 들어있는 List를 오름차순으로 정렬합니다.

import java.util.*;

public class Example {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<>();
        map.put("Nepal", "Kathmandu");
        map.put("United States", "Washington");
        map.put("India", "New Delhi");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        List<String> keyList = new ArrayList<>(map.keySet());
        keyList.sort((s1, s2) -> s1.compareTo(s2));
        for (String key : keyList) {
            System.out.println("key: " + key + ", value: " + map.get(key));
        }
    }
}

결과

key: Australia, value: Canberra
key: England, value: London
key: India, value: New Delhi
key: Nepal, value: Kathmandu
key: United States, value: Washington

참고로, 위의 코드에서 Comparator (s1, s2)->s1.compareTo(s2)는 아래 코드처럼 메소드 레퍼런스를 사용하여String::compareTo로 대체할 수 있습니다.

keyList.sort(String::compareTo);

1.2 Value로 정렬(Sort by value)

다음 코드는 value가 들어있는 List를 오름차순으로 정렬합니다.

import java.util.*;

public class Example {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<>();
        map.put("Nepal", "Kathmandu");
        map.put("United States", "Washington");
        map.put("India", "New Delhi");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        List<String> valueList = new ArrayList<>(map.values());
        valueList.sort(String::compareTo);
        for (String value : valueList) {
            System.out.println("Value: " + value);
        }
    }
}

결과

Value: Canberra
Value: Kathmandu
Value: London
Value: New Delhi
Value: Washington

2. TreeMap을 이용하여 HashMap 정렬

TreeMap은 객체를 생성할 때 인자로 Comparator를 전달할 수 있으며, 요소를 추가할 때 Comparator를 사용하여 key를 정렬하며 그 순서대로 저장이 됩니다. 즉, 데이터를 가져올 때는 이미 정렬된 순서대로 리턴이 되어 다시 정렬할 필요는 없습니다.

아래 예제에서 Comparator는 key를 오름차순으로 정렬하도록 구현하였고, 이것을 TreeMap 생성자의 인자로 전달하여 객체를 생성하였습니다.

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class Example {

    public static void main(String[] args) {

        Comparator<String> comparator = (s1, s2) -> s1.compareTo(s2);
        Map<String, String> map = new TreeMap<>(comparator);
        map.put("Nepal", "Kathmandu");
        map.put("United States", "Washington");
        map.put("India", "New Delhi");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", "
                    + "Value: " + entry.getValue());
        }
    }
}

출력해보면, key가 오름차순으로 정렬되어 출력됩니다.

Key: Australia, Value: Canberra
Key: England, Value: London
Key: India, Value: New Delhi
Key: Nepal, Value: Kathmandu
Key: United States, Value: Washington

TreeMap은 value를 정렬하지는 않기 때문에 key를 정렬하는 경우에만 사용하시면 됩니다.

Comparator, Comparable 클래스 안에 요소들을 어떻게 정렬을 할 것인지에 대한 내용이 구현됩니다. 자세한 내용은 Comparator로 정렬(Sorting)하는 방법 또는 Comparable로 정렬(Sorting)하는 방법을 참고해주세요.

3. Stream을 이용하여 HashMap 정렬

Stream을 이용하여 HashMap을 정렬할 수도 있습니다.

다음 코드는 Stream을 이용하여 value 또는 key를 기준으로 정렬하는 코드입니다. Stream에서 sorted(Map.Entry.comparingByKey()) 같은 코드로 key나 value를 정렬할 수 있습니다.

import java.util.*;
import java.util.stream.Collectors;

public class Example {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<>();
        map.put("Nepal", "Kathmandu");
        map.put("United States", "Washington");
        map.put("India", "New Delhi");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        // sort by key
        List<Map.Entry<String, String>> entries =
                map.entrySet().stream()
                        .sorted(Map.Entry.comparingByKey())
                        .collect(Collectors.toList());
        for (Map.Entry<String, String> entry : entries) {
            System.out.println("Key: " + entry.getKey() + ", "
                    + "Value: " + entry.getValue());
        }

        // sort by value
        System.out.println();
        entries = map.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toList());
        for (Map.Entry<String, String> entry : entries) {
            System.out.println("Key: " + entry.getKey() + ", "
                    + "Value: " + entry.getValue());
        }
    }
}

결과

Key: Australia, Value: Canberra
Key: England, Value: London
Key: India, Value: New Delhi
Key: Nepal, Value: Kathmandu
Key: United States, Value: Washington

Key: Australia, Value: Canberra
Key: Nepal, Value: Kathmandu
Key: England, Value: London
Key: India, Value: New Delhi
Key: United States, Value: Washington

Stream에서 sorted()로 정렬된 아이템을 직접 출력해도 되지만 collect()로 List를 리턴하도록 했습니다.

4. LinkedHashMap을 이용하여 HashMap 정렬

LinkedHashMap는 Map에 입력한 순서가 보장되는 클래스입니다. 즉, LinkedHashMap에 입력하는 순서대로 정렬되고, 이 순서대로 데이터를 다시 꺼낼 수 있습니다. 만약 Map을 사용하고 있는데, 입력한 순서대로 Map에 저장되길 원한다면 LinkedHashMap를 사용할 수 있습니다.

번거로운 방식이지만, HashMap의 key 리스트를 정렬하고, 정렬된 순서대로 LinkedHashMap에 입력하면 입력된 순서대로 저장이 됩니다. LinkedHashMap에서 순서대로 요소를 읽으면, 정렬된 순서대로 읽을 수 있게 됩니다.

4.1 Key로 정렬(Sort by key)

Map.Entry를 리스트로 가져와 key 값으로 정렬하고, 정렬된 순서대로 LinkedHashMap에 추가하면 됩니다.

구현된 코드는 다음과 같습니다.

import java.util.*;

public class Example {

    public static LinkedHashMap<String, String> sortMapByKey(Map<String, String> map) {
        List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());
        Collections.sort(entries, (o1, o2) -> o1.getKey().compareTo(o2.getKey()));

        LinkedHashMap<String, String> result = new LinkedHashMap<>();
        for (Map.Entry<String, String> entry : entries) {
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }

    public static void main(String[] args) {

        Map<String, String> map = new LinkedHashMap<>();
        map.put("Nepal", "Kathmandu");
        map.put("United States", "Washington");
        map.put("India", "New Delhi");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        Map<String, String> result = sortMapByKey(map);
        for (Map.Entry<String, String> entry : result.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", "
                    + "Value: " + entry.getValue());
        }
    }
}

결과를 보면 key를 기준으로 오름차순으로 정렬되었습니다.(알파벳 순서)

Key: Australia, Value: Canberra
Key: England, Value: London
Key: India, Value: New Delhi
Key: Nepal, Value: Kathmandu
Key: United States, Value: Washington

4.2 Value로 정렬(Sort by value)

Map.Entry를 리스트로 가져와 value를 기준으로 정렬하고, 정렬된 순서대로 LinkedHashMap에 추가하면 됩니다.

구현된 코드는 다음과 같습니다.

import java.util.*;

public class Example {

    public static LinkedHashMap<String, String> sortMapByValue(Map<String, String> map) {
        List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());
        Collections.sort(entries, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));

        LinkedHashMap<String, String> result = new LinkedHashMap<>();
        for (Map.Entry<String, String> entry : entries) {
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }

    public static void main(String[] args) {

        Map<String, String> map = new LinkedHashMap<>();
        map.put("Nepal", "Kathmandu");
        map.put("United States", "Washington");
        map.put("India", "New Delhi");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        Map<String, String> result = sortMapByValue(map);
        for (Map.Entry<String, String> entry : result.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", "
                    + "Value: " + entry.getValue());
        }
    }
}

결과를 보면 value를 기준으로 오름차순으로 정렬되었습니다.(알파벳 순서)

Key: Australia, Value: Canberra
Key: Nepal, Value: Kathmandu
Key: England, Value: London
Key: India, Value: New Delhi
Key: United States, Value: Washington

References

  • Baeldung
 
 

Related Posts

  • Java - StringBuilder 사용 방법, 예제
  • Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
  • Java IllegalArgumentException 의미, 발생 이유
  • Java - NullPointerException 원인, 해결 방법
  • Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
  • Java - compareTo(), 객체 크기 비교
  • Java - BufferedWriter로 파일 쓰기
  • Java - BufferedReader로 파일 읽기
  • Java - BigInteger 범위, 비교, 연산, 형변환
  • Java charAt() 함수 알아보기
  • Java contains()로 문자(대소문자 X) 포함 확인
  • Java - Set(HashSet)를 배열로 변환
  • Java - 문자열 첫번째 문자, 마지막 문자 확인
  • Java - 문자열 한글자씩 자르기
  • Java - 문자열 단어 개수 가져오기
  • Java - 1초마다 반복 실행
  • Java - 배열을 Set(HashSet)로 변환
  • Java - 여러 Set(HashSet) 합치기
  • Java - 명령행 인자 입력 받기
  • Java - 리스트 역순으로 순회, 3가지 방법
  • Java - 특정 조건으로 리스트 필터링, 3가지 방법
  • Java - HashMap 모든 요소들의 합계, 평균 계산
  • Java - 특정 조건으로 HashMap 필터링
  • Java - 싱글톤(Singleton) 패턴 구현
  • Java - 숫자 왼쪽에 0으로 채우기
  • Java - String 배열 초기화 방법
  • Java - 정렬된 순서로 Map(HashMap) 순회
  • Java - HashMap에서 key, value 가져오기
  • Java - HashMap을 문자열로 변환
  • Java - HashMap에서 특정 key, value 삭제
  • Java - 반복문 안에서 HashMap 요소 삭제
  • Java - Set에 특정 요소가 있는지 확인
  • Java - ArrayList에서 랜덤으로 요소 가져오기
  • Java - ArrayList 깊은 복사(deep copy)
  • Java - 두개 리스트의 교집합, 공통 요소 찾기

Categories

  1. Java
  2. Kotlin
  3. Python
  4. Android
  5. Linux
  6. Bash
  7. Javascript
  8. C++
  9. C#
  10. Dart
  11. Git
  12. Windows
  13. Etc

What's New

  1. Android 14 - 암시적 인텐트 변경사항 및 문제 해결
  2. 인스타그램 동영상, 사진 저장 방법
  3. Ubuntu 20.04 스팀(Steam) 설치 방법
  4. Java - StringBuilder 사용 방법, 예제
  5. div 영역에 URL 링크 걸기
  6. JavaScript - 배열 전체 출력 (for, forEach, for in, for of)
  7. JavaScript - 한번만 실행되는 함수 (once: true)

Related posts in JAVA

  1. Java - StringBuilder 사용 방법, 예제
  2. Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
  3. Java IllegalArgumentException 의미, 발생 이유
  4. Java - NullPointerException 원인, 해결 방법
  5. Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
  6. Java - compareTo(), 객체 크기 비교
  7. Java - BufferedWriter로 파일 쓰기
 
codechachaCopyright ©2019 codechacha
 

codechacha

Java, Kotlin, Android, Python, Linux 등 Programming, Software 개발 방법을 다룹니다.

codechacha.com

 

Navigated to Java - HashMap 정렬, 4가지 방법

'TIL' 카테고리의 다른 글

어노테이션 커스텀  (0) 2023.05.18
@valid 와 @validated 의 차이 , 그리고 JSR-303 VS 스프링 어노테이션  (0) 2023.05.18
암호화 알고리즘 _ AES알고리즘  (0) 2023.03.02
sts에서 pom.xml 오류가 나는 경우  (0) 2023.01.13
SVN 계정정보 변경(location project가 없을 경우)  (0) 2023.01.11
    'TIL' 카테고리의 다른 글
    • 어노테이션 커스텀
    • @valid 와 @validated 의 차이 , 그리고 JSR-303 VS 스프링 어노테이션
    • 암호화 알고리즘 _ AES알고리즘
    • sts에서 pom.xml 오류가 나는 경우
    HANDA개발
    HANDA개발

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.