본문 바로가기

국비과정/JAVA

20230619 _[12일차]_02. Set & Map

[ Set_ HashSet ] _int 타입

package jun19;

import java.util.HashSet;

//Set : 중복 없어요. index없어요.
//ArrayList : 중복저장합니다. 순서가 있습니다.
public class Set01 {
	public static void main(String[] args) {

		HashSet<Integer> set01 = new HashSet<Integer>();
		set01.add(100);
		set01.add(101);
		set01.add(102);
		set01.add(103);
		set01.add(103);
		set01.add(100);
	
		System.out.println(set01.size());	// 4
		System.out.println(set01);	// [100, 101, 102, 103]
		
		set01.clear();
		System.out.println(set01.size());	// 0
		System.out.println(set01);	// []

		
	}
}

( 로또번호추첨 ) _ 알아서 중복제거됨 굿

		while( set01.size() < 6 ) {
			set01.add( (int) (Math.random() * 45) + 1);
		}
		
		System.out.println(set01.size()); // 6
		System.out.println(set01);	// [ 랜덤번호 여섯개 ]
		
		for (Integer integer : set01) {
			System.out.println(integer);	// 랜덤번호 여섯개(값만출력)
		}

Set은 값의 순서(index)가 없기때문에 for문으로 출력할 수 없음* (get으로 값을 가져올 수가 없음*)

정렬도 불가**, List 타입로 바꾸면 정렬가능~


( HashSet --> ArrayList 변환 후  가져오기 )

		// 정렬 -> List로 변경하기
		ArrayList<Integer> lotto = new ArrayList<Integer>(set01);
		
		System.out.println(lotto);	// [33, 36, 20, 41, 30, 31]
		Collections.sort(lotto);	// 정렬(오름차순)
		System.out.println(lotto);	// [20, 30, 31, 33, 36, 41]
		
		for (int i = 0; i < lotto.size(); i++) {
			System.out.println(lotto.get(i));	// 정렬한 로또번호6개(list값) 출력
		}

[ 객체를 참조하는 ArrayList 생성 ]

package jun19;

import java.util.ArrayList;
import java.util.Arrays;

//주소록 만들어보기

class Human {
	String name;
	String tel;
	
	public Human(String name, String tel) {	// 생성자의 역할 -> 필드초기화, 객체생성
		this.name = name;
		this.tel = tel;
	}
}


public class Temp {
	public static void main(String[] args) {
		
		// 제네릭에는 R타입형태만 적습니다.
		
		ArrayList<Human> arr01 = new ArrayList<Human>();	// 명시된 생성자 Human을 호출하여 ArrayList 객체생성
		arr01.add(new Human("홍길동", "010-5555-5678"));
		arr01.add(new Human("김나래", "010-5488-0147"));
		arr01.add(new Human("임길도", "010-2395-0678"));
		arr01.add(new Human("정길동", "010-8025-0503"));
		arr01.add(new Human("박길동", "010-1490-4509"));
		
		System.out.println(arr01);	// 주소값 출력
		System.out.println(arr01.get(1));	// 주소값 출력

		for (Human human : arr01) {		// arr01의 human들(Human객체의)을 하나씩 가져오기
			System.out.println(human.name + " " + human.tel);
			System.out.println("");
		}
		
	}
}

<> 요 괄호 안에는(제네릭에는) R타입(참조타입)만 올 수 있음!!! 

** Integer도 R타입!!! (int의 R타입형태인거)


[jun19.Human@1eb44e46, jun19.Human@6504e3b2, jun19.Human@515f550a, jun19.Human@626b2d4a, jun19.Human@5e91993f]
jun19.Human@6504e3b2

홍길동 010-5555-5678

김나래 010-5488-0147

임길도 010-2395-0678

정길동 010-8025-0503

박길동 010-1490-4509

[ Set_ HashSet ] _String 타입

package jun19;

import java.util.HashSet;

public class temp02 {
	public static void main(String[] args) {
    
		// String타입을 저장하는 set 생성 (set01)

		HashSet<String> set01 = new HashSet<String>();
		set01.add("사과");
		set01.add("복숭아");
		set01.add("포도");
		set01.add("토마토");
		set01.add("수박");
		set01.add("참외");
		set01.add("배");
		set01.add("사과");
		
		System.out.println(set01);	// 입력한 순서대로 들어가진 않음!
		System.out.println(set01.size());	// 중복은 하나만 저장
		
	}

}

[배, 복숭아, 포도, 토마토, 수박, 사과, 참외]
7

(출력)

		// 방법1 (forEach)
		for (String str : set01) {
			System.out.println(str);
		}
		
		// 방법2 (set -> list 변환후 for문)
		ArrayList<String> arr01 = new ArrayList<String>(set01);

		System.out.println(arr01);
        
		for (int i = 0; i < arr01.size(); i++) {
			System.out.println(arr01.get(i));
		}

배
복숭아
포도
토마토
수박
사과
참외
// 방법1
[배, 복숭아, 포도, 토마토, 수박, 사과, 참외]
배
복숭아
포도
토마토
수박
사과
참외
// 방법2

( Iterator 로 출력 ) _ Iterator 반복자로 형태 변환 후 출력   (책 P. 566)

		Iterator<String> it = set01.iterator();
			
		while (it.hasNext()) {		// 읽어올 요소가 있다면 (참이면)
			String str = (String) it.next();	// 하나씩 데이터 읽어오기
			System.out.println(str);
		}

.hasNext() : 읽어올 요소가 있는지 참/거짓으로 반환
.next() : 다음 데이터를 읽어옵니다.
.remove() : next()로 읽어온 요소를 삭제합니다.

메소드 호출 순서 : hasNext() -> next() -> remove()


[Java]이터레이터(Iterator) 란? (tistory.com)

 

[Java]이터레이터(Iterator) 란?

Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것이다. 컬렉션 프레임워크란 데이터를 저장하는 클래스들을 표준화한 설계이다. 컬렉션

thefif19wlsvy.tistory.com

 


[ Map ]

package jun19;
/*
List : 중복허용, 순서가 있습니다.
Set : 중복x, 순서x 
Map : 키와 값으로 저장합니다. 쌍으로 저장합니다.
		키는 중복될 수 없습니다. 값은 중복 가능합니다.
*/

import java.util.HashMap;

public class Map01 {
	public static void main(String[] args) {
		// Key, Value = 사전
		HashMap<String, String> map01 = new HashMap<String, String>();
		
//		map01.put(120,  1000);	// 데이터타입 다름, 불가능
		
		map01.put("사과", "사과입니다.");
		map01.put("배", "배입니다.");
		map01.put("토마토", "배입니다.");
		map01.put("사과", "사과라고 저장합니다.");	// 중복되는 Key 값에 대해서는 Value 값을 자동으로 업데이트
		
		System.out.println(map01);
		System.out.println("토마토");	// key값으로 Value값 출력
		System.out.println("사과");
		System.out.println("포도");	

		System.out.println("==========================");
		
		System.out.println(map01.size());
		System.out.println(map01.isEmpty());	// 비어있는지? --> true / false
		System.out.println(map01.remove("사과"));	// 사과라고 저장합니다. --> 출력 후 삭제됨
		
		System.out.println("==========================");

		System.out.println(map01.get("배"));
		System.out.println(map01.get("토마토"));
		System.out.println(map01.get("사과"));
        
	}
}

.put ( Key, Value ) : Key값과 Value값 넣기

.get( Key ) :  Key값 이용해서 Value값 가져옴
.isEmpty(  )  : 비어있는지 확인 (true/false)
.remove( Key ) : 삭제됨


{배=배입니다., 토마토=배입니다., 사과=사과라고 저장합니다.}
토마토
사과
포도
==========================
3
false
사과라고 저장합니다.
==========================
배입니다.
배입니다.
사과라고 저장합니다.

( map에서 key값, value값 뽑아내기 ) 

		// keySet() : key를 뽑아줍니다.
		Set<String> ks = map01.keySet();	// key값만 뽑아내기
		System.out.println(ks);	// [배, 토마토, 사과] 

		for (String str : ks) {
			System.out.println(map01.get(str));		// 뽑아낸 key값으로 value값 출력
		}
		
		// values() : value를 뽑아줍니다.
		System.out.println(map01.values());	// value값만 뽑아내기

.keySet() : key값을 뽑아줌

.values() : value값들 뽑아줌


[배, 토마토, 사과]
배입니다.
배입니다.
사과라고 저장합니다.
[배입니다., 배입니다., 사과라고 저장합니다.]

( key값, value값 유무확인, vlaue값 업데이트 및 삭제 )

		System.out.println(map01.containsKey("바나나"));
		System.out.println(map01.containsKey("사과"));
		
		System.out.println(map01.containsValue("바나나입니다."));
		System.out.println(map01.containsValue("배입니다."));
		
		System.out.println(map01);
		map01.replace("토마토", "토마토입니다.");
		System.out.println(map01);
		
		map01.clear();
		System.out.println(map01);
		System.out.println(map01.size());

.containsKey ( Key ) : Key의 유무
.containsValue ( Value ) : Value의 유무

.replace ( Key , Value ) : 해당 Key에 대한 Value값 업데이트

> .put( Key , Value )을 사용해도 value값 업데이트가 가능하지만, 혹시나 key값을 잘못입력하는 경우를 방지하기 위해
replace를 사용하는듯..?


false
true
false
true
{배=배입니다., 토마토=배입니다., 사과=사과라고 저장합니다.}
{배=배입니다., 토마토=토마토입니다., 사과=사과라고 저장합니다.}
{}
0

http://www.tcpschool.com/java/java_collectionFramework_map

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


[ 로그인과정 구현 ]

package jun19;
// 로그인과정 구현
import java.util.HashMap;
import java.util.Scanner;

public class Map02 {
	public static void main(String[] args) {
    
		// key = id		value = pw
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("admin", "01234567");
		map.put("root", "01234567");
		map.put("test", "testtest");
		map.put("admin", "admin01234");	// key 중복
		
		
		Scanner sc = new Scanner(System.in);
		
		boolean loginId = true;
		
		while(loginId) {
			System.out.print("아이디를 입력하세요 : ");
			String id = sc.next();
			
			if (map.containsKey(id)) {	// // id가 있다면 true
				while (loginId) {
					System.out.println("암호를 입력하세요 : ");
					String pw = sc.next();
					
					if(map.get(id).equals(pw)) {	// 입력한 id의 value값과 입력한 pw의 값이 일치한다면 true
						System.out.println("일치합니다.");
						loginId = false;
					} else {
						System.out.println("암호 불일치");
					}
				}
				
			} else {
				System.out.println("아이디가 없습니다.");
			}
			
		}

		
		
	}
}

 

책 p. 586 

Stack , Queue