HashMap을 Key로 정렬하기 위해서는 Arrays.sort 메소드를 사용한다.
Arrays.sort 사용하기 위해서 java.util.Arrays를 import 해줘야 한다.
// key 값 기준 정렬
HashMap<Integer, Integer> map = new HashMap<>();
map.put(6, 1);
map.put(1, 2);
map.put(4, 3);
map.put(10, 4);
map.put(7, 5);
Object[] mapKey = map.keySet().toArray();
Arrays.sort(mapKey);
System.out.println("오름차순 정렬");
for (Integer key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
map 에 키를 6,1,4,10,7 순서로 데이터를 추가한다.
Object 클래스를 선언하고 mapKey에 key를 저장한다.
키만 추출한 Object 클래스인 변수 mapKey를 Arrays.sort 사용하여 정렬한다.
keySet()을 반복문 돌려 출력한다.
(결과)
오름차순 정렬
1 : 2
4 : 3
6 : 1
7 : 5
10 : 4
++ 추가
위 경우처럼 Key가 Integer이라면 정렬이 잘 되지만 Key가 String인 경우에는 적용이 되지 않음을 깨달았다.
2가지 정렬 방법을 더 소개해보겠다.
1) TreeMap 사용
애초에 값을 넣을 때 정렬이 된 채로 저장이 되는 Map이다.
HashMap을 TreeMap으로 바꿔서 사용하거나 처음부터 HashMap으로 선언하고 사용하자
//Map<String,Integer> testMap = new TreeMap<>(map);
Map<String,Integer> testMap = new TreeMap<>();
testMap.put("apple", 1);
testMap.put("pineapple", 2);
testMap.put("orange", 3);
testMap.put("strawberry", 4);
testMap.put("melon", 5);
// 결과 출력
for (Integer nKey : testMap.keySet()) {
System.out.println(nKey + " " + testMap.get(nKey));
}
2) Object[] mapKey를 사용하기
위 방법으로 했을 때 mapKey 배열은 정렬이 된 Map이 된다. Map의 사용이 필요없고 단지 정렬된 값을 출력하는 용도가 필요하다면 이 배열을 반복문 돌려서 사용하자
Map<String,Integer> testMap = new TreeMap<>();
testMap.put("apple", 1);
testMap.put("pineapple", 2);
testMap.put("orange", 3);
testMap.put("strawberry", 4);
testMap.put("melon", 5);
// 키로 정렬
Object[] mapkey = testMap.keySet().toArray();
Arrays.sort(mapkey);
// 정렬안됨
for (Integer nKey : testMap.keySet()) {
System.out.println(nKey + " " + testMap.get(nKey));
}
// 정렬됨
for(int i=0;i<mapkey.length;i++){
System.out.println(mapkey[i]+" "+testMap.get(mapkey[i]));
}
HashMap을 Value로 정렬하기 위해서는 compareTo를 사용한다.
// value 값 기준 정렬
HashMap<Integer, Integer> map2 = new HashMap<>();
map2.put(1, 5);
map2.put(2, 0);
map2.put(3, 3);
map2.put(4, 9);
map2.put(5, 6);
List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(map2.entrySet());
Collections.sort(list, new Comparator<>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()); // 오름차순
// return o1.getValue()-o2.getValue(); // 이 방법도 가능
// return o2.getValue().compareTo(o1.getValue()); // 내림차순
}
});
for(Map.Entry<Integer, Integer> entry : list){
System.out.println(entry.getKey()+" "+entry.getValue());
}
(결과)
오름차순 정렬
2 0
3 3
1 5
5 6
4 9
HashMap에 저장된 데이터 값을 Comparator 함수를 사용하여 정렬한다.
TreeMap은 Key를 기준으로 자동 정렬한다.
// TreeMap 정렬
TreeMap<Integer, Integer> tree = new TreeMap<>();
tree.put(6, 1);
tree.put(1, 2);
tree.put(4, 3);
tree.put(10, 4);
tree.put(7, 5);
System.out.println("오름차순 정렬");
for (Integer key : tree.keySet()) {
System.out.println(key + " : " + tree.get(key));
}
(결과)
오름차순 정렬
1 : 2
4 : 3
6 : 1
7 : 5
10 : 4