Fairy ' s
[JAVA] HashMap / HashSet? 본문
HashMap
- key : value 형태로 데이터를 저장하기 위해 사용된다. // new HashMap<key, value>();
- key 값은 중복이 불가능하지만, value 값은 중복 가능하다.
- key의 타입을 String을 가장 많이 사용한다.
- value의 타입을 여러타입을 사용할 때에는 value 부분에 Object를 사용한다.
// value에 직접 타입을 지정할 때
Map<String, String> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
// value에 타입을 지정하지 않고 Object로 지정할 때
Map<String, Object> map3 = new HashMap<>();
String name = (String) map3.get("name");
int num = (int)map3.get("num");
- value에 직접 타입을 지정할 경우에는 new HashMap을 하나하나 선언해 주어야 한다.
- value에 Object를 type으로 할 경우 .get 메서드를 사용할 때 위 코드와 같이 casting 해주어야 한다.
- 특정 key로 저장된 값 삭제 // map.remove("name")
- 비어있는지 여부 확인 // boolean isEmpty = map.isEmpty();
- 모두 삭제 // map.clear();
예제 1 / 사전 dictionary
package test;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class maptest {
public static void main(String[] args) {
//key's Generic => String, value's Generic => String
Map<String,String> dic = new HashMap<>();
dic.put("cat","고양이");
dic.put("dog","강아지");
dic.put("house","집");
dic.put("run","달리다");
dic.put("phone","전화기");
Scanner scanner = new Scanner(System.in);
System.out.print("찾을 단어를 입력하세요 : ");
String str = scanner.nextLine();
if(dic.containsKey(str)) {
System.out.println("뜻 : "+ dic.get(str));
}else {
System.out.println("존재하지 않는 단어입니다.");
}
}
}
- ContainsKey(str) : str에 입력한 값이 포함되어 있는지 확인하는 메서드
예제 2
package test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class maptest {
public static void main(String[] args) {
//key's Generic => String, value's Generic => String
Map<String,String> dic = new HashMap<>();
dic.put("cat","고양이");
dic.put("dog","강아지");
dic.put("house","집");
dic.put("run","달리다");
dic.put("phone","전화기");
//key 값의 집합을 Set로 얻어내기
Set<String> keys = dic.keySet();
//Set 안에 저장된 아이템을 일렬로 세운 반복자 객체 얻어내기
Iterator<String> it = keys.iterator();
Scanner scanner = new Scanner(System.in);
System.out.print("찾을 value 값을 입력하세요 : ");
String line = scanner.nextLine();
//결과 key 값을 담을 변수
String resultKey = null;
//저장된 아이템이 있는 동안에 반복문 돌면서 아이템을 빼낸다.
while(it.hasNext()) {
String key = it.next();
//키값을 이용해서 value 값을 읽어온다.
String value = dic.get(key);
//만약 value가 입력한 문자열과 같으면
if(value.equals(line)) {
resultKey = key;
}
}
if(resultKey!=null) {
System.out.println("key 값 : " + resultKey);
}else {
System.out.println("해당 value는 저장되지 않았습니다.");
}
}
}
- Iterator<String> 는 반복자 라고 하며 순서대로 정렬하기 위해 사용
- hasNext()는 boolean 타입으로 반환, 다음에 가져올 값이 있는지 확인
- key 값의 집합을 set으로 만들고, set에 저장된 아이템들을 순서대로 정렬한 객체를 얻어낸다.
다음으로 찾을 value 값을 입력받고 반복문을 돌면서 입력받은 값과 같은 value 값이 있을 때까지 찾는다.
HashSet
- Set 인터페이스를 구현한 클래스. Set 성질을 그대로 상속받는다.
- HashSet 은 순서가 없고 key값이 존재하지 않으며 중복을 허용하지 않는다.
- 어떤 데이터를 중복 없는 묶음(집합) 으로 관리하고자 할 때 사용된다.
- 중복을 자동으로 걸러준다.
set1.add("이00");
set1.add("박00");
set1.add("김00");
set1.add("김00"); // 중복불가 자동적으로 추가되지 않음
boolean result = set1.contains("이00");
// 데이터 삭제
boolean isDelete = set1.remove("이00");
// 데이터 크기
int size = set1.size();
- 데이터 포함 여부를 확인하기 위해서는 contains를 사용한다.
- 포함 되어 있으면 true, 아니면 false를 반환한다.
//반복자 객체를 얻어낸다.
Iterator<String> it = set1.iterator();
//반복문 돌면서
while(it.hasNext()) {
//아이템을 하나씩 불러내서 출력하기
String item = it.next();
System.out.println(item);
}
- Iterator를 사용하여 순서가 있게 만들어준다.
- while문을 통해 아이템을 하나씩 호출하여 출력한다.
예제 3
1 ~ 45 의 숫자 중에 랜덤하게 6개를 중복 없이 얻어내서 출력
// import 생략
public class maptest {
public static void main(String[] args) {
Random ran=new Random();
Set<Integer> lottoSet=new HashSet<>();
while(true) {
// 1 ~ 45 사이 랜덤 숫자 얻기
int ranNum=ran.nextInt(45)+1;
// 얻어낸 숫자를 Set에 저장
lottoSet.add(ranNum);
// lottoSet 크기가 6이면 반복문 탈출
if(lottoSet.size() == 6) {
break;
}
}
Iterator<Integer> it=lottoSet.iterator();
while(it.hasNext()) {
int num=it.next();
System.out.print(num+",");
}
}
}
- Random : 랜덤한 숫자를 얻어내는 객체
- Set<Integer> : 랜덤한 숫자를 저장할 객체
'Study > JAVA' 카테고리의 다른 글
[JAVA] Exception / try ~ catch (0) | 2023.01.11 |
---|---|
[JAVA] Wrapper Class ? (0) | 2023.01.11 |
[JAVA] Generics Class ? (0) | 2023.01.10 |
[JAVA] ArrayList ? (0) | 2023.01.10 |
[JFrame] JFrame 이란? / 기초 예제 구현 (0) | 2023.01.09 |
Comments