목적 : HashMap으로 데이터를 메모리에 저장한 후 key와 value 값에 따라 오름차순, 내림차순으로 정렬하고 더 나아가 원하는 방법으로 정렬하기 위해서 Collections.sort 함수 내에 함수를 넣어본다.
HashMap은 Java 내에서 Map 인터페이스로 구현된 클래스이며, Key : value로 구성된 데이터 형태이다. Key와 value는 원하는 형태로 넣을 수 있고, 예시로는 아래처럼 선언하면 된다.
HashMap<Integer, Integer> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
HashMap<String, Integer> map = new HashMap<>();
HashMap<class명,class명> map = new HashMap<>();
선언된 HashMap 내에서 Key는 중복될 수 없고, 동일한 key로 value를 넣으면 기존 value는 삭제되고, 입력한 value가 덮어써진다. HashMap 생성자와 method는 아래와 같다.
생성자 / 메서드 | 설명 |
HashMap() |
- HashMap 객체를 생성 ex) HashMap<String , Integer> map = new HashMap<String , Integer>(); Map<String, Integer> map = new HashMap<String, integer>(); |
HashMap(int initlalCapacity) |
- 지정된 값을 초기 용량으로 하는 HashMap객체를 생성한다. |
HashMap(int initlalCapacity, float loadFactory) |
- 지정된 값을 초기용량과 load factory의 HashMap 객체를 생성한다. |
HashMap(Map m) |
- 주어진 Map에 저장된 모든 요소를 포함하는 HashMap을 생성한다. |
void clear() |
- HashMap에 저장된 모든 객체를 제거한다. ex) map.clear(); |
Object clone() |
- 현재 HashMap을 복제하여 반환한다. ex) newmap = (HashMap)map.clone(); |
boolean containsKey(Object Key) |
- HashMap에 지정된 키(Key)가 포함되어 있는지 알려준다. |
boolean containsValue(Object Value) |
- HashMap에 지정된 값(Value)가 포함되어 있는지 알려준다. |
Set entrySet() |
- HashMap에 저장된 Key - Value갑슬 엔트리(키와 값을 결합)의 형태로 Set에 저장하여 반환 ex) map.put("A", 1); map.put("B", 2); map.put("C", 3); Set set = map.entrySet(); System.out.println("set values are" + set); (result) set values : [A=1,B=2,C=3] |
Object get(Object Key) |
- 지정된 Key 의 값을 반환한다. ex) map.put("A", 1); map.put("B", 2); map.put("C", 3); String val = (String)map.get("B"); System.out.println("Value for key B is: " + val); (result) Value for key B is 2 |
bloolean isEmpty |
- HashMap이 비어있는지 확인한다. ex) boolean val = map.isEmpty(); |
Set keySet() |
- HashMap에 저장된 모든 키가 저장된 Set을 반환한다. ex) map.put("A", 1); map.put("B", 2); map.put("C", 3); Set keyset = map.keySet(); System.out.println("Key set values are" + keyset); (result) Key set values are [A,B,C] |
Object put(Object Key, Object Value) |
- HashMap에 키와 값을 저장. ex) map.put("A", "aaa"); map.put("B", "bbb"); map.put("C", "ccc"); |
void putAll(Map m) |
- Map에 해당하는 모든 요소를 HashMap에 저장한다. |
Object remove(Object Key) |
- HashMap에서 지정된 키로 지정된 값을 제거한다. ex) map.remove("key"); |
int size() |
- HashMap에 저장된 요소의 개수를 반환한다. |
Collection values() |
- HashMap에 저장된 모든 값을 컬렉션 형태로 반환한다. |
출처 : https://vaert.tistory.com/107
HashMap key로 정렬하기
1. TreeMap을 사용하여 정렬
오름차순
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
SortedMap<Integer, Integer> sortedMap = new TreeMap<>(map);
System.out.println(sortedMap);
내림차순
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
SortedMap<Integer, Integer> sortedMap = new TreeMap<>(Comparator.reverseOrder());
sortedMap.putAll(map);
System.out.println(sortedMap);
Map<Integer, Integer> sortedMap = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
sortedMap.putAll(map);
System.out.println(sortedMap);
내림차순에 경우에는 Comparator.reverseOrder()를 생성자 인자로 넣어 선언한 후 putAll 메소드를 사용해 값을 전달하면 된다. Comparatoer 함수를 override하여 사용하여도 된다. return 값 o2 - o1 이 0보다 항상 클 수 있게 만들어준다. ( 반대로 o1 - o2로 return 하면 오름차순 정렬이 된다)
2. List를 사용하여 정렬
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
List<Integer> keyList = new ArrayList<>(map.keySet());
keyList.sort((x1,x2) -> x1 - x2);
for (Integer key : keyList) {
System.out.println("key: " + key + ", value: " + map.get(key));
}
오름차순 정렬
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
List<Integer> keyList = new ArrayList<>(map.keySet());
keyList.sort((x1,x2) -> x2 - x1);
for (Integer key : keyList) {
System.out.println("key: " + key + ", value: " + map.get(key));
}
내림차순 정렬
3. Collection.sort를 사용하여 정렬
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
ArrayList<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
int result = o1.getKey().compareTo(o2.getKey());
if (result == 0) {
return o2.getValue().compareTo(o1.getValue());
}
return result;
}
});
위 코드는 key값으로 내림차순으로 먼저 비교하고 같을 때에는 value값을 비교해 내림차순으로 정렬한다.
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
List<Map.Entry<Integer, Integer>> entryList = new LinkedList<>(map.entrySet());
entryList.sort(Map.Entry.comparingByKey());
HashMap Value로 정렬하기
HashMap<Integer, Integer> map = new HashMap<>();
map.put(10, 34);
map.put(30, 26);
map.put(20, 27);
map.put(15, 29);
List<Map.Entry<Integer, Integer>> entryList = new LinkedList<>(map.entrySet());
entryList.sort(Map.Entry.comparingByValue());
아래와 같이 람다 함수로 sort안에 넣어서 정렬할 수도 있다.
entryList.sort(((o1, o2) -> map.get(o1.getKey()) - map.get(o2.getKey())));
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0; i<numlist.length; i++){
map.put(numlist[i],Math.abs(numlist[i] - n));
}
ArrayList<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
int result = o1.getValue().compareTo(o2.getValue());
if (result == 0) {
return o2.getKey().compareTo(o1.getKey());
}
return result;
}
});
위 코드는 프로그래머스 "특이한 정렬" 문제를 풀면서 HashMap에 key와 value를 넣어 정렬하여 풀이한 코드이다.
프로그래머스 특이한 정렬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/120880
'Java' 카테고리의 다른 글
백준 26008번: 해시 해킹 문제 (1) | 2023.03.16 |
---|---|
[Java] 백준 10818번: 최소, 최대 (0) | 2023.03.15 |
백준 1021번: 회전하는 큐 (0) | 2023.03.14 |
백준 25556번: 포스택 문제 (2) | 2023.03.14 |
[Java] 자주 보는 형 변환 (0) | 2023.03.04 |