Java

[Java] HahsMap, key or value 오름차순, 내림차순

openDeveloper 2023. 3. 7. 09:28

목적 : 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

'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