부트캠프(Java)

자바/스프링 부트캠프 15일차( Collection {set , map} )

동곤일상 2025. 2. 20. 17:50
반응형

 

 

 

1)  Set 

HashSet()

 

TreeSet()

2) Map

HashMap()

Hashtable()

TreeMap()

3)Collection 정리

 

 


2025.02.19 - [AWS활용 자바 부트캠프] - 자바/스프링 부트캠프 14일차( collection )

 

자바/스프링 부트캠프 14일차( collection )

1) 컬렉션 프레임워크    1-1) List     1-2 ) set 1) 컬렉션 프레임워크  * Collection 인터페이스 : 객체를 여러개저장할 수 있는 객체] * List : Collection 인터페이스의 하위* 객체들 저장할 때 저장된

ddkk1120.tistory.com

 

1) Set

어제 간략하게 다룬 Set을 다시한다!!!

 

 

 


 객체추가시 중복 판단 기준

 * 1 .equals 메서드의결과가 true
 * 2. hashCode 메서드의 결과가 같다
 * 1 & 2 모두만족 ㅣ 중복객체로판단
   
 * equals , hashCode 메서드를 동시에 오버라이딩하도록 권장

package ex2_set;

import java.util.HashSet;
import java.util.Objects;

class Person{
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "(name=" + name + ", age=" + age + ")";
	}

	@Override
	public int hashCode() {
		return name.hashCode()+age;
	}

	@Override
	public boolean equals(Object obj) {

		if(obj instanceof Person) {
			Person p = (Person)obj;
			return name.equals(p.name) && age==p.age;
			//들어온객체가 Person객체를 포함한다면
			//이름과 나이가같으면 같은객체로판단
			}
		else return false;
	}

}

	public class SetEx2 {
		public static void main(String[] args) {
			HashSet<Object> set = new HashSet<>();
			set.add(new String("abc"));
			set.add(new String("abc"));
			set.add(new Person("유동곤",26));
			set.add(new Person("유동곤",26));
			//equals & hashCode 구현 안 할시 중복으로인식해 다 저장됨....
			System.out.println(set);
		}
	}

[abc, (name=유동곤, age=26)]

 

equals와 hashCode를 구현하지않는다면

( Set은 중복을 허용하지않지만

Person객체에 넣은 값들이 중복저장될것이다)

 


간단 예제_ )  

Student클래스구현


 * 멤버변수 : 학번 이름 전공
 * 멤버메서드 학생정보출력하게 toString
 *  compareTo() 메서드에서 기본정렬방식이 학번순으로정렬되게 설정
 *  이름과 학번이 같은경우 같은학생으로 인식하도록설정
 

TreeSet에 객체를 사용할떄는  객체가 Comparable을 구현해야함
Integer , String 등은 기본적으로 오버라이딩이 돼 있음.

package ex2_set;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

class Student implements Comparable<Student>{
	String name,major;
	int studno;
	public Student(String name, String major, int studno) {
		super();
		this.name = name;
		this.major = major;
		this.studno = studno;
	}
	public String toString() {
		return "(전공 : "+major+", 학번 : "+studno+", 이름 : "+name+")";
	}
	@Override
	public int compareTo(Student o) {
		return studno - o.studno;//오름차순방법
        //내림차순을 하고싶다면 결과에 -1 곱하자
	}
	@Override
	public int hashCode() {
		
		return name.hashCode()+studno;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			Student s = (Student)obj;
			return name.equals(s.name) && studno==s.studno;
		}
		else return false;
	}
	
}
//----------------------------------------------------------------------------------
public class Exam1 {
	public static void main(String[] args) {
		Set<Student> s = new HashSet<>();
		
		s.add(new Student("유동", "전자공학", 19));
		s.add(new Student("유동", "전자공학", 19));
		s.add(new Student("유동", "전기", 15));
		s.add(new Student("유동", "전기", 15));
		s.add(new Student("하하", "통신", 13));
		System.out.println(s);
		
		System.out.println("--방법 1 --");
		TreeSet<Student> treeSet = new TreeSet<>(s);
		//TreeSet에 객체를 사용할떄는  객체가Comparable을 구현해야함
		//Integer , String 등은 기본적으로 오버라이딩이 돼 있음.
		System.out.println(treeSet);
		
		System.out.println("--방법2--");
		ArrayList<Student> arrayList = new ArrayList<>(s);
		Collections.sort(arrayList);
		System.out.println(arrayList);
	}
}
[(전공 : 전기, 학번 : 15, 이름 : 유동), (전공 : 전자공학, 학번 : 19, 이름 : 유동), (전공 : 통신, 학번 : 13, 이름 : 하하)]
--방법 1 --
[(전공 : 통신, 학번 : 13, 이름 : 하하), (전공 : 전기, 학번 : 15, 이름 : 유동), (전공 : 전자공학, 학번 : 19, 이름 : 유동)]
--방법2--
[(전공 : 통신, 학번 : 13, 이름 : 하하), (전공 : 전기, 학번 : 15, 이름 : 유동), (전공 : 전자공학, 학번 : 19, 이름 : 유동)]

 

 


 TreeSet 예제 : 중복불가 , 정렬됨


 * SortedSet의 구현클래스(set의 하위클래스)

package ex2_set;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

/*
 * TreeSet 예제 : 중복불가 , 정렬됨
 * SortedSet의 구현클래스(set의 하위클래스)
 */

public class SetEx3 {
	public static void main(String[] args) {

		SortedSet<String> set = new TreeSet<>(); /* 이것도 됨!!!! */
		//		Set<String> set = new TreeSet<>(); 
		String from = "bat";
		String to = "d";
		set.add("abc");set.add("alien");set.add("bat");
		set.add("azz");set.add("Car");set.add("disk");set.add("dance");
		set.add("dzzzz");set.add("dZZZZ");set.add("elev");set.add("fan");
		set.add("flower"); 
		System.out.println(set);
		//대문자로시작하는 C가 아스키코드가 가장 작으므로 맨앞에 배치
		System.out.println("subSet(from, to+\"zzzz\") : "+
							set.subSet(from, to+"zzzz"));
		//from 부터 to 앞까지 가져와 라는 뜻 (SortedSet의 고유메서드임 Set으로는 사용불가능)
		//부모는 자식의 기능을 사용할수없음
		System.out.println("subSet(\"abc\", \"azz\") : "+
							set.subSet("abc", "azz"));

		//내림차순 정렬
		System.out.println("==내림차순정렬==");
		set = new TreeSet<>(Comparator.reverseOrder());
		set.add("abc");set.add("alien");set.add("bat");
		set.add("azz");set.add("Car");set.add("disk");set.add("dance");
		set.add("dzzzz");set.add("dZZZZ");set.add("elev");set.add("fan");
		set.add("flower"); 
		System.out.println(set);

		//대소문자 구분없이 정렬되도록
		System.out.println("==대소문자 구분없이 정렬되도록==");
		
		
		//람다방식
//		Comparator<String> f= (s1,s2)->{
//			return s1.compareToIgnoreCase(s2);
//		};
//		
//		set = new TreeSet<String>(f);
		
		//어차피  저 자리에 들어갈 인터페이스는 Comprator밖에없기때문에 생략가능!!
		set =new TreeSet<String>((s1,s2)->s1.compareTo(s2)); 
		set.add("abc");set.add("alien");set.add("bat");
		set.add("azz");set.add("Car");set.add("disk");set.add("dance");
		set.add("dzzzz");set.add("dZZZZ");set.add("elev");set.add("fan");
		set.add("flower");
		System.out.println(set);

	}

}
[Car, abc, alien, azz, bat, dZZZZ, dance, disk, dzzzz, elev, fan, flower]
subSet(from, to+"zzzz") : [bat, dZZZZ, dance, disk]
subSet("abc", "azz") : [abc, alien]
==내림차순정렬==
[flower, fan, elev, dzzzz, disk, dance, dZZZZ, bat, azz, alien, abc, Car]
==대소문자 구분없이 정렬되도록==
[abc, alien, azz, bat, Car, dance, disk, dzzzz, elev, fan, flower]

 


TreeSet (객체 정렬)

객체가 Comarable 또는 Comaprator를 구현해야함

(String , Integer 등은 기본적으로 구현돼 있지만 우리가 만드는 클래스들은

구현이 되어있지 않으므로 해줘야함)

package ex2_set;

import java.util.Set;
import java.util.TreeSet;

class Data implements Comparable<Data>{
	int value;
	Data(int value){
		this.value = value;
	}
	@Override
	public int compareTo(Data o) {
		
		return value-o.value;
	}
	public String toString() {
		return value+"";
	}
}
public class SetEx4 {

	public static void main(String[] args) {
		Set<Data> set =  new TreeSet<Data>((d1,d2)->d1.value - d2.value);
        					//Data가 Comarable 또는 Comaprator를 구현해야함
		set.add(new Data(1));
		set.add(new Data(4));
		set.add(new Data(2));
		set.add(new Data(3));
		System.out.println(set);
	}
}

[1, 2, 3, 4]

 


2) Map

 * Map인터페이스 : (key,객체) 쌍인 객체들의 모임
 * put(key,value) : map에 데이터 추가
 * get(key)   :  value값을 리턴
 * Set keySet() : map객체중 key 목록 조회
 * Set values() : map 객체중 values 목록조회
 * Set<Map,Entry> entrySet() : (키,값)쌍 목록 조회
 *  Map.Entry 객체 : 키,객체(value) 쌍인 객체1개
 *  key : getKey()  
 *  value : getValue()
 * value remove(key) : key 에 해당하는 객체 제거  후 value값 리턴

                                     key값이 존재하지않는다면 null 반환

 

package ex3_map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class MapEx1 {
	public static void main(String[] args) {
		String [] names = {"홍길동","김삿갓","이몽룡","임꺽정","김삿갓"};
		int []nums= {1234,4567,2350,9850,3456};
		HashMap<String,Integer> map = new HashMap<String, Integer>();
		for (int i = 0; i < nums.length; i++) {
			System.out.println(names[i]+"_"+nums[i]);
			map.put(names[i], nums[i]);
		}
		System.out.println("== 최종 Map 구조 ==");
		System.out.println(map);
		System.out.println("홍길동의 값  : "+map.get("홍길동"));//key값이 존재하지않는다면null
		System.out.println("map의 크기 : "+map.size());
		//key 값만 조회
		//keySet() : key값들만 조회 , key들을 Set객체로리턴
		Set<String> keySet = map.keySet();
		System.out.print("key : ");
		for (String s : keySet) {
			System.out.print(s+", ");
		}System.out.println();
		
		System.out.println("------------------------");
		
		//값들만 조회
		Collection<Integer> values = map.values();
		System.out.printf("value : ");
		for (Integer i : values) {
			System.out.print(i+",");
		}System.out.println();
		
		
		System.out.println("--------------------------");
	
		System.out.println("entryset() : (key,객체)쌍인 객체조회");
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry :entrySet) {
			if(entry.getValue()==2350) {
				System.out.print("2350의 key값 : ");
				System.out.println(entry.getKey());
			}
			System.out.println(entry);
			/* System.out.println("("+entry.getKey()+"="+entry.getValue()+")"); */
		}
		
		System.out.println("제거 전 : "+map);
		Integer tel = map.remove("홍길동");
		Integer remove = map.remove("하하");//존재하지않는 key값 입력시 null반환
		System.out.println("제거된 홍길동의 전화번호 "+tel);
		System.out.println("제거 후 map객체의 요소 갯수 : "+map.size());
		System.out.println("제거 후 : "+map);
		
	}
}

 

홍길동_1234
김삿갓_4567
이몽룡_2350
임꺽정_9850
김삿갓_3456
== 최종 Map 구조 ==
{김삿갓=3456, 홍길동=1234, 이몽룡=2350, 임꺽정=9850}
홍길동의 값  : 1234
map의 크기 : 4
key : 김삿갓, 홍길동, 이몽룡, 임꺽정, 
------------------------
value : 3456,1234,2350,9850,
--------------------------
entryset() : (key,객체)쌍인 객체조회
김삿갓=3456
홍길동=1234
2350의 key값 : 이몽룡
이몽룡=2350
임꺽정=9850
제거 전 : {김삿갓=3456, 홍길동=1234, 이몽룡=2350, 임꺽정=9850}
null
제거된 홍길동의 전화번호 1234
제거 후 map객체의 요소 갯수 : 3
제거 후 : {김삿갓=3456, 이몽룡=2350, 임꺽정=9850}

 

 


Map 예제)

 

 * 1. 대한민국 : 서울 ,   캐나다 : 오타와 , 영국 : 런던 , 일본 : 도쿄 저장하는 map 객체
 * 2. 나라이름을 입력받아 수도를 출력해보자 등록된나라가 아니면 수도가 등록되지않았습니다 메시지출력
 *  종료가 입력될때 까지 계속 입력받아
 

package ex3_map;

import java.util.HashMap;
import java.util.Scanner;

public class Exam1 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String [] world = {"대한민국","캐나다","영국","일본"};
		String [] soodo = {"서울","오타와","런던","도쿄"};
		HashMap<String, String> map = new HashMap<>();
		//키값 value값 넣기
		for (int i = 0; i < soodo.length; i++) {
			map.put(world[i], soodo[i]);
		}

		while(true) {
			System.out.print("나라 입력 : ");
			String a = scan.next();
			String s = map.get(a);
			if(a.equals("종료")) {
				System.out.println("@@수도찾기 종료@@");
				break;
			}

			if(s != null) {
				System.out.println(a+"의 수도는 "+s);
			}

			else {
				System.out.println("수도가 등록되지 않았어요");
			}

		}
	}
}

없는 키 (등록되지않은 나라) 값을 입력한다면    null = map.get("없는나라");

null이 반환되므로 if문을 통해 처리를 해줬다

나라 입력 : 일본
일본의 수도는 도쿄

나라 입력 : 도쿄
수도가 등록되지 않았어요

나라 입력 : 대한민국
대한민국의 수도는 서울

나라 입력 : 종료
@@수도찾기 종료@@

 


추가 문제 ( key ,value , entry 조회 관련 )

위 문제에서 종료 시 등록된 나라 , 수도를 각각 출력하고

나라:수도 의 쌍도 출력하고 종료하자

(코드가 긴관계로 구동클래스는 일부만 보여주겠음)

if(a.equals("종료")) {
				keySearch(map);
				valueSearch(map);
				EntrySearch(map);
				break;
			}

종료 시  밑에 메서드3개를 출력하고 종료하는것임!!!!

private static void keySearch(Map map) {
		Set keySet = map.keySet();
		System.out.print("--등록 나라 : ");
		for (Object o : keySet) {
			System.out.print(o+",");
		}System.out.println();
	}
	private static void valueSearch(Map map) {
		Collection values = map.values();
		System.out.print("--등록 수도 : ");
		for (Object o : values) {
			System.out.print(o+",");
		}System.out.println();
	}
	private static void EntrySearch(Map map) {
		System.out.println("--등록 된 쌍 : --");
		Set entrySet = map.entrySet();
		for (Object o : entrySet) {
			System.out.println(o);
		}
	}
나라 입력 : 종료
--등록 나라 : 캐나다,영국,일본,대한민국,
--등록 수도 : 오타와,런던,도쿄,서울,
--등록 된 쌍 : --
캐나다=오타와
영국=런던
일본=도쿄
대한민국=서울

 

4.등록된 나라가 아닌경우 수도를 입력받아 map객체에 추가해보자

(편의를 위해 코드의while문만 보여줌!!!)

	while(true) {
			System.out.print("나라 입력 : ");
			String a = scan.next();
			String s = map.get(a);
			if(a.equals("종료")) {
				keySearch(map);
				valueSearch(map);
				EntrySearch(map);
				break;
			}

			if(s != null) {
				System.out.println(a+"의 수도는 "+s);
			}

			else {
				System.out.println("수도가 등록되지 않았어요");
				System.out.println("수도를 등록할까요? (Y)");
				String y = scan.next();
				if(y.equalsIgnoreCase("Y")){
					String sudo = scan.next();
					map.put(a,sudo);
					System.out.println("등록완료");
				}
				else continue;
				
			}

		}

나라 입력 : 유동

수도가 등록되지 않았어요

수도를 등록할까요? (Y)

y

유동교

등록완료

나라 입력 : 유동

유동의 수도는 유동교

나라 입력 :

 


도서정보 예제( 맨 밑에 예제와 연관)

추가 삭제 검색 조회

package ex3_map;

import java.util.Collection;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

class Book{
	String title;
	String author;
	int price;
	public Book(String title, String author, int price) {
		this.title = title;
		this.author = author;
		this.price = price;
	}
	@Override
	public String toString() {
		return "(" + title + "," + author + "," + price + ")";
	}
	
	
}

public class MapEx2 {
	static Map<String,Book> books = new HashMap<>();
	public static void main(String[] args) {
		Scanner scan= new Scanner(System.in);
		
	
		while(true) {
			try {
			System.out.println("1.추가 2.삭제 3.조회 4.검색 0.종료");
			int choose = scan.nextInt();
			if(choose==0)break;
			switch(choose) {
			case 1-> {addBoook();}
			case 2-> {deleteBook();}
			case 3-> {printBook();}
			case 4-> {searchBook();}
			default-> System.out.println("잘못된 입력입니다 1 2 3 4 0 중에입력 ");
			
				}
			}
			catch (InputMismatchException e) {
				System.out.println("1,2,3,4,0 숫자만 입력하세요");
				scan.next();
			}
			
		}
		
	}
	private static void searchBook() {
		Scanner scan = new Scanner(System.in);
		System.out.println("책 검색 시작");
		System.out.print(" 제목을 입력하세요 : ");
		String name = scan.next();
		Book book = books.get(name);
		if(book==null) {
			System.out.println("존재하지않는제목");
		}
		else {
			System.out.println(book);	
		}
	}
 //------------------------------------------------------------------
	private static void printBook() {
		System.out.println("도서목록 조회");
		Collection<Book> values = books.values();
		for (Book book : values) {
			System.out.println(book);
		}
		
	}
 //------------------------------------------------------------------
	private static void deleteBook() {
		Scanner scan = new Scanner(System.in);
		System.out.printf("삭제 할 책 이름을 입력 : ");
		String title = scan.next();
		Book remove = books.remove(title);//key값으로 삭제할요소를 찾아냄
		if(remove ==null) {
			System.out.println("없는 도서에요");}
		else {
		System.out.println(remove+" 삭제 완료");
		System.out.println("현재 도서 재고 : "+books);}
	}
//------------------------------------------------------------	
	private static void addBoook() {
		System.out.println("도서를 추가할게요 ");
		Scanner scan = new Scanner(System.in);
		System.out.printf("제목 : ");
		String title = scan.next();
		System.out.printf("저자 : ");
		String author = scan.next();
		System.out.printf("가격 : ");
		try {
		int price = scan.nextInt();
		 Book book = new Book(title, author, price);
		books.put(title,book);
		System.out.println(book+" 도서 추가");}
		catch(InputMismatchException e){
			System.out.println("처음부터 다시입력해주세요");
			scan.next();
		}
	}
}
1.추가 2.삭제 3.조회 4.검색 0.종료
1
도서를 추가할게요 
제목 : 채식주의자
저자 : 한강
가격 : 13000
(채식주의자,한강,13000) 도서 추가
1.추가 2.삭제 3.조회 4.검색 0.종료
1
도서를 추가할게요 
제목 : 소년이온다
저자 : 한강
가격 : 14000
(소년이온다,한강,14000) 도서 추가
1.추가 2.삭제 3.조회 4.검색 0.종료
3
도서목록 조회
(채식주의자,한강,13000)
(소년이온다,한강,14000)
1.추가 2.삭제 3.조회 4.검색 0.종료
2
삭제 할 책 이름을 입력 : 채식주의자
(채식주의자,한강,13000) 삭제 완료
현재 도서 재고 : {소년이온다=(소년이온다,한강,14000)}
1.추가 2.삭제 3.조회 4.검색 0.종료
4
책 검색 시작
 제목을 입력하세요 : 소년이온다
(소년이온다,한강,14000)
1.추가 2.삭제 3.조회 4.검색 0.종료
3
도서목록 조회
(소년이온다,한강,14000)
1.추가 2.삭제 3.조회 4.검색 0.종료
4
책 검색 시작
 제목을 입력하세요 : 안녕하세요
존재하지않는제목
1.추가 2.삭제 3.조회 4.검색 0.종료
0

TreeMap<k,v>( )

 

https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/TreeMap.html

 

TreeMap (Java SE 23 & JDK 23)

floorEntry

docs.oracle.com

key값 기준으로 정렬을 하는 map

package ex3_map;

import java.util.SortedMap;
import java.util.TreeMap;

/*
 * TreeMap : key값 기준으로 정렬을하는 map
 */
public class MapEx3 {
	public static void main(String[] args) {
		TreeMap<String,Book> books = new TreeMap<>();
	
		books.put("홍길동전",new Book("홍길동전","허균",10000));
		books.put("춘향전",new Book("춘향전","미상",14000));
		books.put("구운몽",new Book("구운몽","미상",5000));
		System.out.println(books);
		
		System.out.println("TreeMap에서만 구현 가능한 조회 메서드!!!");
		System.out.println("첫번째 key : "+books.firstKey());
		System.out.println("첫번째 entry : "+books.firstEntry());
		System.out.println("마지막 key : "+books.lastKey());
		System.out.println("마지막 entry : "+books.lastEntry());
		//lowerEntry(key) : key 앞쪽 객체
		System.out.println("춘향전 앞의 entry : "+books.lowerEntry("춘향전"));
		//higherEntry(key)  : key 뒤쪽 객체
		System.out.println("춘향전 뒤의 entry : "+books.higherEntry("춘향전"));
		//floorEntry("춘") : 춘 부터 앞쪽 객체(자신도 포함)
		System.out.println("춘 앞의 entry : "+books.floorEntry("춘"));
		//floorEntry("춘") : 춘 부터 뒤쪽 객체(자신도 포함)
		System.out.println("춘 뒤의 entry : "+books.ceilingEntry("춘"));
	}
}

{구운몽=(구운몽,미상,5000), 춘향전=(춘향전,미상,14000), 홍길동전=(홍길동전,허균,10000)}

TreeMap에서만 구현 가능한 조회 메서드!!!

첫번째 key : 구운몽

첫번째 entry : 구운몽=(구운몽,미상,5000)

마지막 key : 홍길동전

마지막 entry : 홍길동전=(홍길동전,허균,10000)

 

춘향전 앞의 entry : 구운몽=(구운몽,미상,5000)

춘향전 뒤의 entry : 홍길동전=(홍길동전,허균,10000)

 

춘 앞의 entry : 구운몽=(구운몽,미상,5000)

춘 뒤의 entry : 춘향전=(춘향전,미상,14000)

 


TreeMap의 조회를 이용한 예제

 

package ex3_map;

import java.lang.reflect.Field;
import java.util.Comparator;
import java.util.TreeMap;

public class Exam2 {
	public static void main(String[] args) {
		TreeMap<Integer,String> scores = new TreeMap<>();
		mapPut(scores);
		System.out.println(scores);
		System.out.println("첫번쨰key : "+scores.firstKey());
		System.out.println("마지막 key : "+scores.lastKey());
//		System.out.println("가장 높은 점수를 받은 사람의 이름 : "
//							+scores.get(scores.lastKey()));
		System.out.println("가장 높은 점수를 받은 사람의 이름 : "
							+scores.lastEntry().getValue());
		System.out.println("94점보다 앞의 점수 : "+scores.lowerKey(94));
		System.out.println("94점보다 뒤의 점수 : "+scores.higherKey(94));
		System.out.println("94를 포함한 앞의 점수 : "+scores.floorKey(94));
		System.out.println("94를 포함한 뒤의 점수 : "+scores.ceilingKey(94));
		
		System.out.println("======revverse!!(내림차순)========");
		scores = new TreeMap<>(Comparator.reverseOrder());
		mapPut(scores);
		System.out.println(scores);
		System.out.println("가장낮은 점수받은 사람의 이름 : "+scores.lastEntry().getValue());
		System.out.println("94보다 큰  점수 : "+scores.lowerKey(94));
	}
	
	private static void mapPut(TreeMap<Integer,String> scores) {
		scores.put(87, "홍길동");
		scores.put(98, "이몽룡");
		scores.put(75, "임꺽정");
		scores.put(94, "조사병단");
		scores.put(82, "유재석");
		scores.put(88, "하하");
	}

}



/*
{75=임꺽정, 82=유재석, 87=홍길동, 88=하하, 94=조사병단, 98=이몽룡}
첫번쨰key : 75
마지막 key : 98
가장 높은 점수를 받은 사람의 이름 : 이몽룡
94점보다 앞의 점수 : 88
94점보다 뒤의 점수 : 98
94를 포함한 앞의 점수 : 94
94를 포함한 뒤의 점수 : 94
======revverse!!(내림차순)========
{98=이몽룡, 94=조사병단, 88=하하, 87=홍길동, 82=유재석, 75=임꺽정}
가장낮은 점수받은 사람의 이름 : 임꺽정
94보다 큰  점수 : 98
*/

 


 * Map 구현 클래스

 * HashMap : (key , value) 쌓인 객체의 모임 . 순서를 모름
 * TreeMap : (key , value) 쌓인 객체의 모임 . 키값으로정렬순서
 * HashTable : (key , value) 쌓인 객체의 모임 , 순서를 모름 , **구버전(List의 Vector같은존재)**
 *  동기화 : 스레드에 대해서 safe

package ex3_map;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

public class MapEx4 {
	public static void main(String[] args){
		
		Hashtable<String, String> map = new Hashtable<>();
		map.put("학생", "student");
		map.put("선생", "teacher");
//		map.put(null, "null"); /* hashtable객체에서는 null을 key로사용할수없음 */
		System.out.println(map);
		
		
		Map<String, String> map2 = new HashMap<>();
		map2.put("학생", "student");
		map2.put("선생", "teacher");
		map2.put(null, "null"); //hashmap객체에서는 null을 key로 사용가능
		System.out.println(map2);	
	}
}

{선생=teacher, 학생=student}

{null=null, 선생=teacher, 학생=student}


3 ) Collection 정리

 

1) List

순서유지 , 인덱스사용

정렬사용 ( Comparable , Comprator)

ex)ArrayList , Vector , LinkedList

 

 

2) set

 중복불가  

 중복판별

(내가만든 객체는

hashCode와 equals를 구현해서 넣자)

 

HashSet , TreeSet , LinkedHashset

 

3)map

키값쌍으로 이루어짐

 


예제 리뷰(정렬과 Map에 관련된 예제)

 

문제1)

 * 1 ~ 99까지의 정수를 입력받아서 TreeSet에 저장하고, 0 을 입력하면 입력을 종료한다. 
 * 입력된 값을 정렬하여 출력하기.
   1 ~ 99 까지의 숫자가 아닌 경우 TreeSet에서 저장하지 말것.
 * 
 * set1 오름차순 정렬되도록 출력.
 * set2 내림차순 정렬되도록 출력하기.
 * 
 *[결과]
1부터 99까지의 숫자를 입력하세요 (종료 : 0)
1 2 5 9 1 100 12 3 2 5 64 123 4 5 0
set1:[1, 2, 3, 4, 5, 9, 12, 64]
set2:[64, 12, 9, 5, 4, 3, 2, 1]

 

package test_setMap;

import java.util.Comparator;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.TreeSet;

public class Test1 {
	public static void main(String[] args) {
		Scanner scan  =  new Scanner(System.in);
		TreeSet<Integer> set = new TreeSet<Integer>();
		TreeSet<Integer> set2 = new TreeSet<>(Comparator.reverseOrder());
		System.out.println("1~99사이의 숫자입력 : 종료(0)");
		while(true) {
			try {
				int num = scan.nextInt();
				if(num==0)break;
				if(1<=num && num<=99) {
					set.add(num);
					set2.add(num);
				}
				
			}
			catch(InputMismatchException e) {
				scan.next();
			}
		}
		System.out.println("set : "+set);
		System.out.println("set2 : "+set2);
	}
}

1. 기본적으로 오름차순정렬하는 기본 TreeSet 생성

 

2. TreeSet을 하나 더 만들어준다 (Comparator.reverserOrder())로 

내림차순정렬을 하는 TreeSet이다

 

3.nextInt()에 String문자열을 넣으면 발생되는 예외를 catch해 주고

scan.next()로 없애준다 그 후 계속 루프!!

 

4.1보다 크고 99보다 작은 num만 각 set에 넣는다

set1 , set2

 

0이입력되면

각 Treeset을 출력하면 됨

1~99사이의 숫자입력 : 종료(0)

1 2 6 24 4 5 78 65 32 21 17

0

set : [1, 2, 4, 5, 6, 17, 21, 24, 32, 65, 78]

set2 : [78, 65, 32, 24, 21, 17, 6, 5, 4, 2, 1]


 

예제 2)

1.궁합음식의 키를 입력받아 해당되는 음식을 출력하기. 
  종료가 입력될때 까지 계속 출력하기
2.종료 입력시 등록된 내용 출력하기
  등록된음식 :
    떡볶이 : 오뎅
    짜장면 : 단무지
3. 등록이 안된경우 
   등록여부를 입력받아, 등록하는 경우 궁합음식을 입력받기  
   등록하시겠습니까(y)? 
     y입력 : foods객체에 추가.
            궁합음식 입력받아서 foods에 추가함
     y가아닌경우 :
            음식을 다시 입력하기   

[결과]
음식명을 입력하세요(종료:종료)
떡볶이
떡볶이의 궁합음식:오뎅
음식명을 입력하세요(종료:종료)
치킨
치킨의 궁합음식이 등록되어 있지 않습니다.등록하시겠습니까?
y
치킨의 궁합음식을 등록하세요
맥주
음식명을 입력하세요(종료:종료)
종료
{치킨=맥주, 떡볶이=오뎅, 라면=김치}

여기서 생각해야할점 

1. 등록이 안된경우를 찾는 방법

2.등록여부 확인문

3. foods 객체에 추가하는 방법

4. 추가를 하지 않을 시 루프의처음으로 돌아갈 방법

 

public class Test2 {
	public static void main(String[] args) {
		Scanner scan  =  new Scanner(System.in);
		HashMap<String,String> map = new HashMap<>();
		map.put("떡볶이", "오뎅");
		map.put("치킨", "맥주");
		map.put("라면", "김치");
		
		while(true) {
			System.out.println("음식명을 입력하세요(종료:종료)");
			String food = scan.next();
			String food2 = map.get(food);
			if(food.equals("종료")) {
				System.out.println(map);
				System.out.println("종료합니다");
				break;
			}
			if(food2==null) {
				System.out.println(food+"의 궁합음식이없어요");
				System.out.println("등록할까요? (y)");
				String y = scan.next();
				if(y.equalsIgnoreCase("Y")) {
					System.out.println(food+"의 궁합음식 등록");
					String s= scan.next();
					map.put(food, s);
				}
				else {
					continue;
				}
				
			}
			else {
				System.out.println(food+"의 궁합 : "+food2);
			}
		}
	}
}

food는 map객체이다

map.get( key)로

key와 매핑하는 값이 있는지 확인이가능

만약 없다면 null을 반환함

 

등록한다고 한다면

궁합을 입력받고

map.put(food , s) 로 넣어준다

 

등록하지않는다면

contiue 로 처음으로 돌아감

음식명을 입력하세요(종료:종료)

떡볶이

떡볶이의 궁합 : 오뎅

 

음식명을 입력하세요(종료:종료)

닭갈비

닭갈비의 궁합음식이없어요

등록할까요? (y)

y

닭갈비의 궁합음식 등록

치즈

음식명을 입력하세요(종료:종료)

종료

{치킨=맥주, 닭갈비=치즈, 떡볶이=오뎅, 라면=김치}

종료합니다

 


 

예제3) 가장어려웠음

 * MapEx2의 예제를 이용하기
 *
 * 조회를 입력했을 경우
 * 제목,저자,가격순으로 조회되도록 프로그램 수정하기
 *  
 * 검색을 입력했을 경우 
 * 제목,저장,가격으로 검색하도록 프로그램을 수정하기
 * 
 * [결과]
1.추가 2.삭제 3.조회 4.검색 0.종료
3
정렬 방식을 입력하세요 (1.제목 2.저자 3.가격)
1
(춘향전,미상,5000)
(홍길동전,허균,10000)

1.추가 2.삭제 3.조회 4.검색 0.종료
4
도서를 검색합니다.
조회 기준을 입력하세요 (1.제목 2.저자 3.가격)
1 
제목을 입력하세요
홍길동전
조회 정보 : (홍길동전,허균,10000) 입니다.

이건 MapEx2의 예제까지 이용한거라

코드가 굉장히 길어졌다 

그러므로

메서드별로 다 나눠서 보여주겠다

 

추가와 삭제메서드는 위에 도서예제에 있는거와 바뀌지않아  올리지않았음!!

 

 

Book클래스(map의 값으로 들어가게됨)

class Book implements Comparable<Book>{
	String title;
	String author;
	int price;
	public Book(String title, String author, int price) {
		this.title = title;
		this.author = author;
		this.price = price;
	}
	@Override
	public String toString() {
		return "(" + title + "," + author + "," + price + ")";
	}
	@Override
	public int compareTo(Book o) {
		return title.compareTo(o.title);
	}


}

정렬을 위해

Comparable을 구현해  compareTo메서드를  오버라이딩했음( 제목기준)


구동클래스

public class Test3_A {
	private static Map<String,Book> books = new HashMap<>();

	public static void main(String[] args) {
		Scanner scan= new Scanner(System.in);
		
		//확인용
		books.put("안녕", new Book("안녕", "하이", 10000));
		books.put("채식주의자", new Book("채식주의자", "한강", 5000));
		books.put("가나다", new Book("가나다", "당근", 8000));
		books.put("마라", new Book("마라", "수박", 2000));
		//확인용


		while(true) {
			try {
				System.out.println("1.추가 2.삭제 3.조회 4.검색 0.종료");
				int choose = scan.nextInt();
				if(choose==0)break;
				switch(choose) {
				case 1-> {addBoook();}
				case 2-> {deleteBook();}
				case 3-> {printBook();}
				case 4-> {searchBook();}
				default-> System.out.println("잘못된 입력입니다 1 2 3 4 0 중에입력 ");

				}
			}
			catch (InputMismatchException e) {
				System.out.println("1,2,3,4,0 숫자만 입력하세요");
				scan.next();
			}

		}

	}

 

검색(searchBooke ) 메서드

 

Map타입인 books의 값을 인자로받는 List나Set을 만든다

(books의 값이 List나 Set에 들어가는것)

 

그 후  번호를 입력받는다 

try catch문을 사용해

문자를 입력했을 경우에 예외를 터트리지않고

호출메서드로 돌아감

 

switch문으로 번호마다 다른문장을 실행

1번 or 아무번호 입력  title을 포함하는 요소를 출력후 return;

(return 해야 호출메서드로 돌아갈 수 있음)

중요점 : title은 map에서의key 이기때문에

중복이 없으므로 하나라도 찾앗다면 return;

 

2번이면 저자를 입력받아 book에 존재한다면 

새로만든 book을 요소로사용하는 bookList2에 저장

(리스트에 저장하지않고 출력후

return 시 중복되는 저자는 출력이 되지않음)

 

for문이 모두 종료됐을 시점에

bookList2.size가 0이면 존재하지않는 저자

그게아니라면 bookList2 출력

 

2번이면 가격을 입력받아 book에 존재한다면 

새로만든 book을 요소로사용하는 bookList2에 저장

(저장하지않고 출력 후 return 시

중복되는 가격에 대한 객체는 출력이 되지않음)

 

for문이 모두 종료됐을 시점에

bookList2.size가 0이면 존재하지않는 가격

그게아니라면 bookList2 출력

책 검색 시작

검색기준 입력 : 1(제목) 2(저자) 3(가격) (아무거나입력시 제목!)

3

가격을 입력하세요8000

[(가나다,당근,8000), (유동곤,당근,8000)]   

//title 부분처럼  포함되는 객체를 찾았다고 return하면 중복 되는 가격을 출력할 수 없음

 

 

private static void searchBook() {
		Scanner scan = new Scanner(System.in);
		System.out.println("책 검색 시작");
		List<Book> bookList = new ArrayList<>(books.values());
		//		Set<Book> bookset = new HashSet<>(books.values());
		System.out.println("검색기준 입력 : 1(제목) 2(저자) 3(가격) (아무거나입력시 제목!)");
		
		try {
			int num = scan.nextInt();
			switch(num) {
			case 1->{
				System.out.print("제목을 입력하세요");
				String next = scan.next();
				Book book2 = null;
				for (Book book : bookList) {
					if(book.title.equals(next)){
						System.out.println(book2);
						return;//return으로 현재메서드를 종료하고 호출한곳으로 가게 됨 (104번째줄)
						//map의 key값은 중복될수없으니 제목은 중복되는게 없을거다
					}
				}System.out.println(next+"는 없는 제목");
				//			for(Book book : bookset) {
				//				if(book.title.equals(next)){
				//					System.out.println(book);
				//						return;
				//				} 검색은 Set도 가능한 것을 확인
				//			}
			}

			case 2->{
				System.out.print("저자를 입력하세요");
				String next = scan.next();
				ArrayList<Book> bookList2 = new ArrayList<Book>();
				for (Book book : bookList) {
					if(book.author.equals(next)){
						bookList2.add(book);
					}
				}
				if(bookList2.size()==0) {
					System.out.println(next+"는 존재하지않는 저자");
				}
				else {
					System.out.println(bookList2);
				}

			}
			case 3->{
				System.out.print("가격을 입력하세요");
				int price = scan.nextInt();
				ArrayList<Book> bookList2 = new ArrayList<Book>();
				for (Book book : bookList) {
					if(book.price==price){
						bookList2.add(book);
					}
				}
				if(bookList2.size()==0) {
					System.out.println(price+"는 존재하지않는 가격");
				}
				else {
					System.out.println(bookList2);
				}
			}

			default->{
				System.out.print("제목을 입력하세요");
				String next = scan.next();
				for (Book book : bookList) {
					if(book.title.equals(next)){
						System.out.println(book);
						return;
					}
				}System.out.println(next+"존재하지않는 제목");
			}
			}
		}
		catch(InputMismatchException e) {
			System.out.println("숫자만 입력");
			scan.next(); 
			return;
		}
	}

 

조회메서드(printBook)

 

조회메서드의 경우에도 제목 저자 가격별로 정렬을 요청하는 메서드이다

nextInt()로 숫자를 입력받기때문에

InputMismatchException이 발생할 수 있다/

try catch문으로 예외를 잡아 호출메서드로다시보내자.

 

1번을 선택했다면 book클래스에 CompareTo를  title기준으로

정렬해놨으니 Collection.sort() 후 bookList를 출력해주면 됨

 

2번은 저자 기준으로 정렬이다 저자는 String(래퍼객체)이기때문에

CompareTo 메서드사용가능!!!

람다식을 이용해

(S1,s2)->s1.author.compareTo(s2.author) 을 해주면

한글순으로 오름차순 정렬이 됨

 

3번은 가격입력부분이므로

그냥 s1.price - s2.price 로 오름차순정렬을 해줌

 

 

private static void printBook() {
		Scanner scan = new Scanner(System.in);
		System.out.println("도서목록 조회");
		System.out.println("조회방식을 입력하세요 1제목 2저자 3가격(아무거나입력시 제목 순)");
		try {
			int print = scan.nextInt();
			List<Book> bookList = new ArrayList<>(books.values());
			switch(print) {
			case 1->Collections.sort(bookList);//객체에 제목으로 compare을 오버라이딩해놨음
			case 2->{Collections.sort(bookList,//저자로 정렬(compareTo활용)
				(s1,s2)->s1.author.compareTo(s2.author));}
			case 3->{Collections.sort(bookList,
				(s1,s2)->s1.price-s2.price);}//가격으로 정렬
			default ->Collections.sort(bookList);
			}
			System.out.println(bookList);
		}
		catch(InputMismatchException e) {
			System.out.println("숫자만 입력 ");
			scan.next();
		}
	}