KH 22일차(HashMap, TreeSet)
22일차인 오늘은 HashMap과 TreeSet에 대해서 학습했다.
생각보다 많이 헷갈리고 많이 어려웠다. 꼼꼼히 복습 시작하도록 하겠숨둥.
HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없습니다. 만약 기존의 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다.
HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 기본생성자를 호출하면 됩니다. HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데, List 처럼 저장공간을 한 칸씩 늘리지 않고 두배로 늘립니다.
출처 : https://coding-factory.tistory.com/556
[Java] 자바 HashMap 사용법 & 예제 총정리
HashMap 이란? HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. Map은 키와 값으로 구성된 Entry객체를 저장하는
coding-factory.tistory.com
HashMap을 이용해서 String Integer을 파라미터로 주고 key와 value를 이용해서 간단한 로그인 예제를 해보겠다!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws Exception {
HashMap<String, Integer> map = new HashMap();
// map.put("이건", "전민우");
// map.put("이건", "전민우우");
map.put("mlolw2", 1234);
// key값은 중복되지 않는다. 중복되게 입력하면 마지막에 입력한 값이 저장된다.
// System.out.println(map);
// BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("id와 password를 입력해주세요!");
System.out.print("id : ");
String id = sc.nextLine();
if(!map.containsKey(id)) {
System.out.println("입력하신 " + id + " 는 존재하지 않습니다. 다시 입력해주세요");
continue;
}else {
System.out.print("Password : ");
int password = Integer.parseInt(sc.nextLine());
System.out.println();
if(!map.get(id).equals(password)) {
System.out.println(map.get(id));
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요!");
}else {
System.out.println("축하합니다. 로그인 성공하셨습니다.");
break;
}
}
}
}
}
HashMap에 String, Integer을 파라미터로 설정하고 ID를 key값으로 Password를 Value값으로 넣어놓고, 사용자로부터 입력받은 값이 key와 매칭이 되면 그 다음 반복문으로 넘어가게 설정하고, get(id) 즉, key값과 매칭되는 Value값과 사용자로부터 입력받은 Password가 일치할 경우 최종적으로 로그인이 성공되게 구현했다.
* 여기서 의문인점은, password를 입력받을 때, 바로 int password = sc.next(); 로 받아서 사용하면 틀렸을 때, 내가 원했던 방향으로 코드가 흘러 가지 않고,, 잘못 입력했던 값을 그대로 가지고 sc.nextLine()에 적용된다는 점이다.. 왜 그런 건지는 계속 찾아봤는데 원하는 답이 나오지 않아서,, 조금 더 고민해 봐야겠다..ㅜㅜ
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Main {
public static void main(String[] args){
// 이름 : 안자바 , 점수 : 100
// 이름 : 나자바 , 점수 : 100
// 이름 : 강자바 , 점수 : 80
// 이름 : 이자바 , 점수 : 90
// 이름 : 전민우 , 점수 : 100
//
// 참가자 명단[안자바, 나자바, 강자바, 이자바, 전민우]
// ㅋㅋ : 100
// ㅋㅋ : 100
// ㅋㅋ : 80
// ㅋㅋ : 90
// ㅋㅋ : 100
// 총점 : 470
// 평균 : 94.0
// 최고 점수 : 100
// 최저 점수 : 80
HashMap<String, Integer> map = new HashMap();
map.put("안자바", 100);
map.put("나자바", 100);
map.put("강자바", 80);
map.put("이자바", 90);
map.put("전민우", 100);
Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry e = (Entry) it.next();
System.out.println("이름 : " + e.getKey() + ", 점수 : " + e.getValue());
}
Set s = map.keySet();
System.out.println("참가자 명단" + s);
int total = 0;
Collection c = map.values();
Iterator itt = c.iterator();
while(itt.hasNext()) {
Integer ii = (Integer)itt.next();
System.out.println("ㅋㅋ : " + ii);
total += ii;
}
System.out.println("총점 : " + total);
System.out.println("평균 : " + (float)total/ s.size());
System.out.println("최고 점수 : " + Collections.max(c));
System.out.println("최저 점수 : " + Collections.min(c));
}
}
HashMap 생성 후, Iterator을 사용해서 key와 value를 각각 출력해보고, key 값들만 Set에 넣고 출력해보고, value값들만 Collection에 넣어서 출력해보고 학습한 여러 방법들을 동원해서 혼자사 공부했다. 여기서 HashMap은 순서가 정해지지 않게 저장되기 때문에, 출력값이 예측이 되지 않는다는 점이당.