> Java > java지도 시간 > 키가 아닌 값으로 TreeMap을 정렬하려면 어떻게 해야 합니까?

키가 아닌 값으로 TreeMap을 정렬하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-23 05:59:23
원래의
144명이 탐색했습니다.

How Can I Sort a TreeMap by its Values, Not Keys?

값으로 TreeMap 정렬

TreeMap은 키가 자연 순서에 따라 오름차순으로 정렬되는 정렬 맵입니다. 값을 기준으로 사용자 정의 정렬이 필요한 경우 대신 값을 평가하는 비교기를 사용해야 합니다.

이러한 비교기를 구현하려는 시도는 다음과 같습니다.

class byValue implements Comparator<Map.Entry<String, Integer>> {
    public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
        if (e1.getValue() < e2.getValue()) {
            return 1;
        } else if (e1.getValue() == e2.getValue()) {
            return 0;
        } else {
            return -1;
        }
    }
}
로그인 후 복사

그러나 TreeMap은 값만을 기준으로 정렬할 수 없기 때문에 이 접근 방식에는 결함이 있습니다. 해당 키와 연관된 값이 아닌 해당 키를 정렬하도록 설계되었습니다.

대체 솔루션: Map.Entry 정렬

이 제한을 극복하기 위해 외부 컬렉션을 사용할 수 있습니다. Map.entrySet() 컬렉션을 정렬하는 데 사용됩니다. 이 정렬된 집합을 사용하면 값을 기준으로 필터링하고 정렬할 수 있습니다. 다음은 값을 기준으로 Map.entrySet()을 정렬하는 일반적인 방법입니다.

static <K, V extends Comparable<? super V>>
SortedSet<Map.Entry<K, V>> entriesSortedByValues(Map<K, V> map) {
    SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>(
        new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) {
                int res = e1.getValue().compareTo(e2.getValue());
                return res != 0 ? res : 1;
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}
로그인 후 복사

이 방법을 사용하면 아래 설명과 같이 값을 기준으로 정렬된 Map.Entries 집합을 얻을 수 있습니다.

Map<String, Integer> map = new TreeMap<>();
map.put("A", 3);
map.put("B", 2);
map.put("C", 1);   

System.out.println(map); // prints "{A=3, B=2, C=1}"
System.out.println(entriesSortedByValues(map)); // prints "[C=1, B=2, A=3]"
로그인 후 복사

정수 평등에 대한 참고 사항

가치가 있습니다 제공된 코드는 ==를 사용하여 정수 값을 비교합니다. 이는 값 동일성이 아닌 참조 동일성을 확인하므로 일반적으로 권장되지 않습니다. 일부 시나리오에서는 예상치 못한 결과가 발생할 수 있습니다. 대신 값 비교를 위해 CompareTo()와 같은 메서드를 사용하는 것이 좋습니다.

위 내용은 키가 아닌 값으로 TreeMap을 정렬하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿