Java에서 값별로 맵을 정렬하는 방법

  1. 자바에서sort()메서드를 사용하여Map <key, value>정렬
  2. 자바에서sorted()메서드를 사용하여Map<key, value>정렬
  3. 자바에서Comparator와 함께sort()메서드를 사용하여Map<key, value>정렬
  4. 자바에서sorted()toMap()메서드를 사용하여Map<key, value>정렬
  5. 자바에서 사용자 지정 코드를 사용하여Map<key, value>정렬

이 자습서에서는 Java에서 값별로Map<key, value>를 정렬하는 방법을 소개하고이를 이해하기위한 몇 가지 예제 코드를 나열합니다.

Map<key, value>를 정렬하는 방법에는 여러 가지가 있습니다. 여기서는sort(),sorted()메소드, 비교기 인터페이스 등을 사용합니다. 예제를 보겠습니다.

자바에서sort()메서드를 사용하여Map <key, value>정렬

List 인터페이스의sort()메소드를 사용하여 Map의 요소를 정렬 할 수 있습니다. sort()메서드는 요소를 오름차순으로 정렬하고comparingByValue()메서드를 사용하여 값별로 정렬합니다. 아래 예를 참조하십시오.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		List<Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
		list.sort(Entry.comparingByValue());
		list.forEach(System.out::println);
	}
}

산출:

1=100
2=1020
3=300
5=500
After Sorting
1=100
3=300
5=500
2=1020

자바에서sorted()메서드를 사용하여Map<key, value>정렬

스트림으로 작업하는 경우 요소를 오름차순으로 정렬하는sorted()메서드를 사용할 수 있습니다. sorted()메소드에Map.Entry.comparingByValue()를 인수로 전달하여Map<key, value>를 값별로 정렬합니다.

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		Stream<Map.Entry<Integer, Integer>> sorted =
			    map.entrySet().stream()
			       .sorted(Map.Entry.comparingByValue());
		sorted.forEach(System.out::println);
	}
}

산출:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

자바에서Comparator와 함께sort()메서드를 사용하여Map<key, value>정렬

이 예제에서는compareTo()메서드를 사용하여sort()메서드 내부의Map <key, value>값을 인수로 비교합니다. Comparator인터페이스의 익명 내부 클래스를 만들고 값을 비교하기 위해 compare메서드를 정의한 것을 볼 수 있습니다.

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		 List<Entry<Integer, Integer>> list = new LinkedList<>(map.entrySet());
		    Collections.sort(list, new Comparator<Object>() {
		       @SuppressWarnings("unchecked")
			public int compare(Object o1, Object o2) {
		            return ((Comparable<Integer>) ((Map.Entry<Integer, Integer>) (o1)).getValue()).compareTo(((Map.Entry<Integer, Integer>) (o2)).getValue());
		        }
		    });
		    Map<Integer, Integer> result = new LinkedHashMap<>();
		    for (Iterator<Entry<Integer, Integer>> it = list.iterator(); it.hasNext();) {
		        Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) it.next();
		        result.put(entry.getKey(), entry.getValue());
		    }
		    result.forEach((k,v)->System.out.println(k+"="+v));
	}
}

산출:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

자바에서sorted()toMap()메서드를 사용하여Map<key, value>정렬

이 예제에서는sorted()메서드를 사용하여Map <key, value>를 정렬하고toMap()메서드를 사용하여 결과를LinkedHashMap에 수집합니다. 여기서는 메소드 참조 개념을 사용하여LinkedHashMap 객체를 생성했습니다.

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		Map<Integer, Integer> result = map.entrySet().stream()
                .sorted(Entry.comparingByValue())
                .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
		    result.forEach((k,v)->System.out.println(k+"="+v));		    
	}
}

산출:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

자바에서 사용자 지정 코드를 사용하여Map<key, value>정렬

여기서는 Comparator인터페이스를 구현하는 사용자 정의 클래스를 만들고 해당 객체를 TreeMap에 전달하여 값별로 Map<key, value>를 정렬했습니다.

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
class UserComparator implements Comparator<Object> {
	Map<Integer, Integer> map;
	public UserComparator(Map<Integer, Integer> map) {
		this.map = map;
	}
	public int compare(Object o1, Object o2) {
		if (map.get(o2) == map.get(o1))
			return 1;
		else
			return ((Integer) map.get(o1)).compareTo((Integer)     
					map.get(o2));
	}
}
public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		UserComparator comparator = new UserComparator(map);
	    Map<Integer, Integer> result = new TreeMap<Integer, Integer>(comparator);
	    result.putAll(map);
		result.forEach((k,v)->System.out.println(k+"="+v));
	}
}

산출:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

관련 문장 - Java Map

  • Java Hashmap의 값에서 키를 얻는 방법
  • Java에서 맵의 각 요소를 반복하는 방법