MAP는 사전 또는 연관 배열 등으로도 알려진 키 값 쌍의 모음이며 가장 일반적인 데이터 구조 중 하나입니다. Java의 값으로 맵을 정렬하는 방법은 무엇입니까? 단순 해 보이지만 쉽지는 않습니다!
예를 들어, 맵에서 키는 단어를 나타내는 문자열 유형이며 값은 int 유형이며 단어가 나타나는 횟수를 나타냅니다. 이제 우리는 단어가 나타나는 횟수로 정렬하고 싶습니다.
map map = new treemap (); map.put ( "me", 1000); map.put ( "and", 4000); map.put ( "You", 3000); map.put ( "Food", 10000); Map.put ( "Hungry", 5000); Map.put ( "나중", 6000);
값별로 정렬 한 결과는 다음과 같습니다.
키 밸브 1000you 3000 및 4000hungry 5000later 6000food 10000
우선 SortedMap은 값으로 정렬 된 맵이 아닌 키로 정렬 된 맵이기 때문에 SortedMap 구조를 채택 할 수 없습니다. 우리가 원하는 것은 값으로 정렬 된지도입니다.
정렬 맵으로 이것을 할 수 없습니까?
아니요, 맵이 키로 정렬되기 때문에.
방법 1 : 방법 1
다음 Java 코드 :
import java.util.iterator; import java.util.set; import java.util.treeset; public class main {public static void main (string [] args) {set set = new treeset (); set.add (새 쌍 ( "me", "1000")); set.add (새 쌍 ( "및", "4000"); set.add (새 쌍 ( "You", "3000")); set.add (새 쌍 ( "음식", "10000"); set.add (새 쌍 ( "Hungry", "5000")); set.add (새 쌍 ( "나중", "6000"); set.add (새 쌍 ( "나 자신", "1000")); for (iterator i = set.iterator (); i.hasnext ();) system.out.println (i.next ()); }} 클래스 쌍은 비슷한 {개인 최종 문자열 이름; 개인 최종 INT 번호; 공개 쌍 (문자열 이름, int 번호) {this.name = 이름; this.number = 숫자; } public 쌍 (문자열 이름, 문자열 번호)은 숫자 formatexception {this.name = name; this.number = integer.parseint (번호); } public int compareto (object o) {if (o instanceof pair) {int cmp = double.compare (번호, ((쌍) o)) .number); if (cmp! = 0) {return cmp; } return name.compareto (((쌍) o) .name); } 새 ClassCastException을 던지십시오 ( "" + o.getClass (). getName ())과 쌍을 비교할 수 없습니다. } public String toString () {return name + '' + 숫자; }} 유사한 C ++ 코드 :
typedef pair <string, int> pair; int cmp (const 쌍 & x, const 쌍 & y) {return x.second> y.second;} map <string, int> m; vector <pair> vec; for (map <wstring, int> :: iterator curr = m.begin (cur! = m.end (); ++ curr) {Vec.push.push_bach. curr-> second));} sort (vec.begin (), vec.end (), cmp); 위의 방법의 필수 중요성은 다음과 같습니다. 맵 구조의 키 값 쌍 (Map.entry)을 사용자 정의 클래스 (struct)로 캡슐화하거나 Map.entry 클래스를 직접 사용하십시오. 사용자 정의 클래스는 스스로 정렬하는 방법, 즉 값별로 정렬하는 방법을 알고 있으며, 특히 비교 가능한 인터페이스를 구현하거나 비교기 객체를 자체적으로 구축 한 다음 맵 구조를 사용하지 않고 순서 세트를 사용합니다 (SortedSet, Treeset은 SortedEdSet의 구현입니다). 즉,지도를 사용하는 대신 맵. 엔트리는 객체로 간주되므로 문제가 순서 대상 객체 세트를 구현하거나 객체 세트를 정렬하는 것입니다. SortedSet을 사용하여 삽입이 완료된 후 자연스럽게 주문하거나 목록 또는 배열을 사용한 다음 (collections.sort () 또는 array.sort ())를 정렬 할 수 있습니다.
자체 수업에서 정보를 캡슐화합니다. 중 하나를 구현합니다
자연 순서에 대한 규칙을 비교하고 쓰기 또는 쓰기
귀하의 기준에 따라 비교기. 정보를 정렬 된 상태로 저장하십시오
수집 또는 collections.sort () 메소드를 사용하십시오.
방법 2 : 방법 2.
다음 코드를 사용하여 값별로 정렬 할 수도 있습니다.
public static map sortbyvalue (맵 맵) {list list = new linkedList (map.EntrySet ()); collections.sort (list, new comparator () {public int compare (object o1, object o2) {return ((비교 가능) ((map.entry) (o1))) .compareto (((map.entry) (o2))). getValue ());}}); MAP 결과 = New LinkedHashMap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry entry = (map.entry) it.next (); result.put (Entry.getKey (), entery.getValue ()); } 반환 결과; } public static map sortByvalue (맵 맵, 최종 부울 리버스) {list list = new LinkedList (map.Entryset ()); collections.sort (list, new comparator () {public int compare (object o1, object o2) {if (return -(return -(return-) ((비교 가능) (o1))) .compareto (((map.entry)) (O2)) .compareto (((Map.Entry) (O2)). getValue ()); MAP 결과 = New LinkedHashMap (); for (iterator it = list.iterator (); it.hasnext ();) {map.entry entry = (map.entry) it.next (); result.put (Entry.getKey (), entery.getValue ()); } 반환 결과; } map map = new Hashmap (); map.put ( "a", 4); map.put ( "b", 1); map.put ( "c", 3); map.put ( "d", 2); MAP SORTED = SORTBYVALUE (MAP); System.out.println (정렬); // 출력 : {b = 1, d = 2, c = 3, a = 4} 또는 다음과 같이 수행 할 수 있습니다. 맵 맵 = new Hashmap (); map.put ( "a", 4); map.put ( "b", 1); map.put ( "c", 3); map.put ( "d", 2); set <map.entry <string, integer >> treeset = new treeset <map.entry <string, integer >> (새 비교기 <map.entry <string, integer >> () {public int compart (map.entry <string, integer> o1, map.entry <string, integer> o2) {intger d2 = o1. getValue () int r = d2.compareto (r! = 0) rething r return reach (o1.getkey ()); treeset.addall (map.entryset ()); System.out.println (treeset); // 출력 : [a = 4, c = 3, d = 2, b = 1] 또한 그루비에서 값으로 정렬 맵을 구현하는 것은 물론 본질은 동일하지만 매우 간단합니다.
Groovy에서 정렬 맵 방법을 사용하십시오 (Groovy 1.6 필요).
def result = map.sort () {a, b-> b.value.compareto (a.value)} 좋다:
[ "A": 3, "B": 1, "C": 4, "D": 2] .SORT {A, B-> A.Value -B.Value}
결과는 [b : 1, d : 2, a : 3, c : 4]입니다.
파이썬에서 유사 :
h = { "a": 2, "b": 1, "c": 3} i = h.items () // i = [( 'a', 2), ( 'c', 3), ( 'b', 1)] i.sort (lambda (k1, v1)), (k2, v2) : cmp (v2, v1)) // i = ( 'C', 3), ( 'B', 1)]위의 기사는 값별로 Java Map 정렬에 대해 간단히 이야기합니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.