(JAVA)HashMap,TreeMap
컬렉션의 전반적인 설명은 아래 링크를 참고하자.
https://acid7937.tistory.com/37
먼저 Set과 List, Map은 전부 돌아가는 방식이 비슷하다. 개인적인 생각으로 이 글을 안봐도 Map을 이해하는데 문제가 없다고 생각한다.
Set 설명
https://acid7937.tistory.com/42
List 설명
https://acid7937.tistory.com/39
이번에는 Map을 알아볼 것이다.
Map은 순서는 없고 키중복은 안되고 값 중복은 가능하다.
순서X 키중복X 값중복 O
회원가입할때가 대표적으로 Map이 사용될때 라고 언급하였었다.
혹은 제품명과 수량 같은곳에서도 사용할수 있겠다.
Set과 List를 봤다면 Map도 사용법이 거의 동일한것을 알수 있을것이다. 코드로 살펴보자.
HashMap
3명의 회원 아이디와 숫자로 된 비밀번호를 가져오는 코드다.
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String,Integer> loginInfo = new HashMap();
loginInfo.put("memberA",12345678);
loginInfo.put("memberB",12345678);
loginInfo.put("memberC",789456123);
loginInfo.put("memberC",12345678);
System.out.println(loginInfo);
}
}
출력결과는 다음과 같다.
Map의 특징이 바로 나온다. 우리는 위의 코드에서 Map은 저장된 순서로 출력이 안되고 값중복만 가능하고 memberC를 보면 마지막에 입력된 값으로 덮어 쓰이는 것을 확인할수 있다.
HashMap<String,Integer> loginInfo = new HashMap();
이 부분을 살펴보면 제네릭에 두가지 래퍼 클래스가 오는걸 알수 있는데 앞에가 키 타입이고 뒤에가 값 타입이다.
Map의 메서드들을 사용하면 다양하게 기능을 사용할수 있는데 키값만 빼오는 것도 가능하다.
Keyset을 사용하면
public class Main {
public static void main(String[] args) {
HashMap<String,Integer> loginInfo = new HashMap();
loginInfo.put("memberA",12345678);
loginInfo.put("memberB",12345678);
loginInfo.put("memberC",789456123);
loginInfo.put("memberC",12345678);
System.out.println(loginInfo.keySet());
}
}
출력결과는 다음과 같다.
값만 출력 하고 싶다면 values를 사용하면 된다.
public class Main {
public static void main(String[] args) {
LinkedHashMap<String,Integer> loginInfo = new LinkedHashMap();
loginInfo.put("memberA",12345678);
loginInfo.put("memberB",12345678);
loginInfo.put("memberC",789456123);
loginInfo.put("memberC",12345678);
System.out.println(loginInfo.values());
}
}
출력결과는 다음과 같다.
만약 입력 순서를 지키고 싶다면 Map에도 방법이 존재한다.
바로 LinkedHapMap을 사용하면 간단하게 해결이 가능하다.
public class Main {
public static void main(String[] args) {
LinkedHashMap<String,Integer> loginInfo = new LinkedHashMap();
loginInfo.put("memberA",12345678);
loginInfo.put("memberB",12345678);
loginInfo.put("memberC",789456123);
loginInfo.put("memberC",12345678);
System.out.println(loginInfo.keySet());
}
}
출력 결과는 다음과 같다.
컬랙션 메서드를 사용하면 값의 최대값 최소값도 손쉽게 구할수가 있다.
public class Main {
public static void main(String[] args) {
LinkedHashMap<String,Integer> loginInfo = new LinkedHashMap();
loginInfo.put("memberA",100);
loginInfo.put("memberB",200);
loginInfo.put("memberC",300);
Integer max = Collections.max(loginInfo.values());
Integer min = Collections.min(loginInfo.values());
System.out.println("최대값 "+ max);
System.out.println("최소값 "+ min);
}
}
출력 결과는 다음과 같다.
TreeMap
TreeMap도 있는데 Tree 형식으로, 돌아가는 구조가 기존 Tree 처럼 이진탐색트리로 동작한다. Map 에서는 키값을 트리 형식으로 저장한다. *또한 트리라서 출력 결과를 정렬하는데 문자는 사전식 숫자는 오름차순으로 정렬한다.
Map은 레드블랙트리를 사용하는데 구조상 O(log n)의 시간복잡도를 보장한다. 시간복잡도는 나중에 다룰 예정이고 레드블랙트리를 자세히 살펴볼 필요가 없다 생각되어 작성하지는 않겠다.
이진탐색트리는 https://acid7937.tistory.com/42 여길 한번 확인해 보도록 하자.
public class Main {
public static void main(String[] args) {
TreeMap<String,String> loginInfo = new TreeMap();
loginInfo.put("memberA","as1234");
loginInfo.put("memberB","gha551");
loginInfo.put("memberC","51gg12+");
System.out.println(loginInfo);
}
}
출력결과는 다음과 같다.