웹사이트 검색

Java에서 값으로 HashMap을 정렬하는 방법은 무엇입니까?


Java의 HashMap은 빠른 조회를 제공합니다. 항목을 "키, 값\ 쌍으로 저장합니다. HashMap에서 값을 가져오려면 해당 항목에 해당하는 키를 사용합니다.

HashMaps는 사전 및 디렉토리를 구현하는 좋은 방법입니다.

키와 값은 서로 다른 유형일 수 있습니다(예: 문자열, 정수).

키와 값에 따라 HashMap의 항목을 정렬할 수 있습니다.

이 튜토리얼에서는 값에 따라 HashMap을 정렬합니다.

기본 전략은 목록의 HashMap에서 값을 가져오고 목록을 정렬하는 것입니다. 여기서 Value의 데이터 유형이 문자열이면 비교기를 사용하여 목록을 정렬합니다. 비교기에 대해 자세히 알아보려면 이 자습서를 읽으십시오.

정렬된 값 목록이 있으면 이 새 목록을 기반으로 HashMap을 다시 빌드합니다.

코드를 살펴보겠습니다.

값 간단한 예제로 HashMap 정렬

먼저 목록에서 문자열 값을 가져옵니다. 그런 다음 목록을 정렬합니다.

목록에서 문자열 값을 정렬하기 위해 비교기를 사용합니다. 이 비교기는 값 목록을 사전순으로 정렬합니다.

 Collections.sort(list, new Comparator<String>() {
            public int compare(String str, String str1) {
                return (str).compareTo(str1);
            }
        });

목록을 정렬했으면 이 정렬된 목록을 기반으로 HashMap을 빌드합니다.

전체 코드는 다음과 같습니다.

package com.journaldev.collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;


public class Main {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        LinkedHashMap<String, String> sortedMap = new LinkedHashMap<>();
        ArrayList<String> list = new ArrayList<>();
        map.put("2", "B");
        map.put("8", "A");
        map.put("4", "D");
        map.put("7", "F");
        map.put("6", "W");
        map.put("19", "J");
        map.put("1", "Z");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            list.add(entry.getValue());
        }
        Collections.sort(list, new Comparator<String>() {
            public int compare(String str, String str1) {
                return (str).compareTo(str1);
            }
        });
        for (String str : list) {
            for (Entry<String, String> entry : map.entrySet()) {
                if (entry.getValue().equals(str)) {
                    sortedMap.put(entry.getKey(), str);
                }
            }
        }
        System.out.println(sortedMap);
    }
}

출력 :

{8=A, 5=B, 3=D, 7=F, 10=J, 2=W, 1=Z}

HashMap 항목은 문자열 값에 따라 정렬됩니다.

HashMap을 값으로 정렬하는 또 다른 예

HashMap의 값이 Integer 유형인 경우 코드는 다음과 같습니다.

package com.JournalDev;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;


public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
        ArrayList<Integer> list = new ArrayList<>();
        map.put("A", 5);
        map.put("B", 7);
        map.put("C", 3);
        map.put("D", 1);
        map.put("E", 2);
        map.put("F", 8);
        map.put("G", 4);
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            list.add(entry.getValue());
        }
        Collections.sort(list); 
        for (int num : list) {
            for (Entry<String, Integer> entry : map.entrySet()) {
                if (entry.getValue().equals(num)) {
                    sortedMap.put(entry.getKey(), num);
                }
            }
        }
        System.out.println(sortedMap);
    }
}

출력 :

{D=1, E=2, C=3, G=4, A=5, B=7, F=8}

여기서 HashMap 값은 Integer 값에 따라 정렬됩니다.

사용자 지정 비교기를 사용하여 HashMap 정렬

위의 예를 보면 Value 개체는 Comparator 인터페이스를 구현합니다. 값이 사용자 지정 개체인 예를 살펴보겠습니다.

값에 따라 해시 맵을 정렬하기 위해 사용자 지정 비교기를 만들 수도 있습니다. 이는 값이 사용자 지정 개체일 때 유용합니다.

값이 '이름'이라는 클래스인 경우를 예로 들어 보겠습니다. 이 클래스에는 firstName과 lastName이라는 두 개의 매개변수가 있습니다.

클래스 이름의 코드는 다음과 같습니다.

package com.JournalDev;

public class Name {
   String firstName;
   String lastName;
   Name(String a, String b){
       firstName=a;
       lastName=b;

   }
    public String getFirstName() {
        return firstName;
    }


}

사용자 지정 비교기는 다음과 같습니다.

Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

우리는 firstName에 따라 이름을 정렬하고 있으며 lastName을 사용하여 정렬할 수도 있습니다. 목록을 사용하여 맵에서 값을 가져오는 대신 LinkedHashMap을 사용하여 정렬된 해시맵을 직접 생성합니다.

전체 코드는 다음과 같습니다.

public static void main(String[] args) {
        HashMap<Integer, Name> hmap = new HashMap<Integer, Name>();
        Name name1 = new Name("Jayant", "Verma");
        Name name2 = new Name("Ajay", "Gupta");
        Name name3 = new Name("Mohan", "Sharma");
        Name name4 = new Name("Rahul", "Dev");


        hmap.put(9, name1);
        hmap.put(1, name2);
        hmap.put(6, name3);
        hmap.put(55, name4);

        Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

        LinkedHashMap<Integer, Name> sortedMap = hmap.entrySet().stream()
                .sorted(Map.Entry.<Integer, Name>comparingByValue(byName))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        
//printing the sorted hashmap 
        Set set = sortedMap.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry me2 = (Map.Entry) iterator.next();
            System.out.print(me2.getKey() + ": ");
         System.out.println(hmap.get(me2.getKey()).firstName + " "+hmap.get(me2.getKey()).lastName );
          
        }
    }

출력 :

1: Ajay Gupta
9: Jayant Verma
6: Mohan Sharma
55: Rahul Dev

결론

이 튜토리얼에서는 값에 따라 HashMap을 정렬하는 방법을 다루었습니다. 문자열 값에 대한 정렬은 정수 값과 다릅니다. 문자열 값은 정렬을 위해 비교기가 필요합니다. 반면 Integer 값은 Collection.sort()를 사용하여 직접 정렬됩니다.