Java공부(코딩)

코딩초보의 자바(Java)공부 30일차 { Map , Stack , Queue }

동곤일상 2025. 1. 16. 13:40
반응형
뭘했다고 벌써 30일차인지.....
1월31일부터 본격적으로 웹개발을 배우러갑니다.
잘할수있을진 모르겠지만 열심히 해볼게요!!!!!

 


컬렉션 프레임워크 -Map 소개

Map 은 키-값의 쌍을 저장하는 자료 구조이다.


키는 맵 내에서 유일해야 한다. 그리고 키를 통해 값을 빠르게 검색할 수 있다.
키는 중복될 수 없지만, 값(value)은 중복될 수 있다.


Map 은 순서를 유지하지 않는다


Map의 주요메서드


이중에 HashMap을가장많이 사용한다.

예제를 통해 알아보자

 

package javaBasic2.collection.map;

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

public class MapMain {
	public static void main(String[] args) {
		HashMap<Integer,String> hashMap = new HashMap<Integer, String>();
		hashMap.put(1, "동곤자바");
		hashMap.put(1, "키 중복시 마지막으로 저장한 값이 들어감");
		hashMap.put(2, "많관부");
		hashMap.put(3, "Map을사용해봤습니다.");
		
		System.out.println(" map : "+hashMap+"\n");

		
		System.out.println("@@특정 키 값 조회@@");
		String vaule1 = hashMap.get(1);
		System.out.println("1번key의 값 : "+vaule1+"\n");
		
		System.out.println("@@keySet 사용@@");
		Set<Integer> keySet = hashMap.keySet();
		for (Integer key : keySet) {
			String value = hashMap.get(key);
			System.out.println("key : "+key+" value : "+value);
		}
		System.out.println();
		
		System.out.println("@@entrySet 사용@@");
		Set<Entry<Integer, String>> entrySet = hashMap.entrySet();
		for (Entry<Integer, String> entry : entrySet) {
			System.out.println("key : "+entry.getKey() +
					" value : "+entry.getValue());
		}
		
		System.out.println("\n@@값 목록 조회@@");
		Collection<String> values = hashMap.values();
		for (String string : values) {
			System.out.println("vaule : "+string);
		}
		
		
	}

}

map : {1=키 중복시 마지막으로 저장한 값이 들어감, 2=많관부, 3=Map을사용해봤습니다.}

 

@@특정 키 값 조회@@

1번key의 값 : 키 중복시 마지막으로 저장한 값이 들어감

 

@@keySet 사용@@

key : 1 value : 키 중복시 마지막으로 저장한 값이 들어감

key : 2 value : 많관부

key : 3 value : Map을사용해봤습니다.

 

@@entrySet 사용@@

key : 1 value : 키 중복시 마지막으로 저장한 값이 들어감

key : 2 value : 많관부

key : 3 value : Map을사용해봤습니다.

 

@@값 목록 조회@@

vaule : 키 중복시 마지막으로 저장한 값이 들어감

vaule : 많관부

vaule : Map을사용해봤습니다.

 

키 목록 조회
Set<Integer> keySet = hashMap.keySet();
Map 의 키는 중복을 허용하지 않는다. 따라서 Map 의 모든 키 목록을 조회하는 keySet() 을 호출하면,

 중복을 허용 하지 않는 자료 구조인 Set 을 반환한다.

키와 값 목록 조회
Entry Key-Value Pair

Map 은 키와 값을 보관하는 자료 구조이다. 따라서 키와 값을 하나로 묶을 수 있는 방법이 필요하다. 이때 Entry 를 사
용한다.
Entry 는 키-값의 쌍으로 이루어진 간단한 객체이다. Entiry 는 Map 내부에서 키와 값을 함께 묶어서 저장할 때 사
용한다.
쉽게 이야기해서 우리가 Map 에 키와 값으로 데이터를 저장하면 Map 은 내부에서 키와 값을 하나로 묶는 Entry 객체
를 만들어서 보관한다. 참고로 하나의 Map 에 여러 Entry 가 저장될 수 있다.
참고로 Entry 는 Map 내부에 있는 인터페이스이다. 우리는 구현체보다는 이 인터페이스를 사용하면 된다.

 

값 목록 조회
Collection<String> values = hashMap.values();
Map 의 값 목록을 중복을 허용한다. 따라서 중복을 허용하지 않는 Set 으로 반환할 수는 없다. 그리고 입력 순서를 보장하지 않기 때문에 순서를 보장하는 List 로 반환하기도 애매하다. 따라서 단순히 값의 모음이라는 의미의 상위 인터
페이스인 Collection 으로 반환한다.

 

같은키에 다른 값 저장

Map 에 값을 저장할 때 같은 키에 다른 값을 저장하면 기존 값을 교체한다.
1="동곤자바" →  1="  키 중복시 마지막으로 저장한 값이 들어감 "으로

변경된 것을 확인할 수 있다.

 


컬렉션프레임워크 - Map구현체

 대표적으로 HashMap , TreeMap , LinkedHashMap 이 있다

 

1. HashMap:
구조: HashMap 은 해시를 사용해서 요소를 저장한다. 키( Key ) 값은 해시 함수를 통해 해시 코드로 변환되고, 이
해시 코드는 데이터를 저장하고 검색하는 데 사용된다.
특징: 삽입, 삭제, 검색 작업은 해시 자료 구조를 사용하므로 일반적으로 상수 시간( O(1) )의 복잡도를 가진다.
순서: 순서를 보장하지 않는다.


2. LinkedHashMap:
구조: LinkedHashMap 은 HashMap 과 유사하지만, 연결 리스트를 사용하여 삽입 순서 또는 최근 접근 순서에
따라 요소를 유지한다.
특징: 입력 순서에 따라 순회가 가능하다. HashMap 과 같지만 입력 순서를 링크로 유지해야 하므로 조금 더 무겁
다.
성능: HashMap 과 유사하게 대부분의 작업은 O(1) 의 시간 복잡도를 가진다.
순서: 입력 순서를 보장한다.


3. TreeMap:
구조: TreeMap 은 레드-블랙 트리를 기반으로 한 구현이다.
특징: 모든 키는 자연 순서 또는 생성자에 제공된 Comparator 에 의해 정렬된다.
성능: get , put , remove 와 같은 주요 작업들은 O(log n) 의 시간 복잡도를 가진다.
순서: 키는 정렬된 순서로 저장된다.

(트리는 자세히 다루지않겠다 자주 사용하지 않음)


각 구현체에 대해 코드로보자

 

package javaBasic2.collection.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

public class MapMain2 {
	public static void main(String[] args) {
		
		run(new HashMap<String, Integer>());
		run(new LinkedHashMap<String, Integer>());
		run(new TreeMap<String, Integer>());

	}

	private static void run(Map<String, Integer> map) {
		map.put("User4", 20);
		map.put("User3", 30);
		map.put("User2", 20);//값은 중복되어도상관x
		map.put("User1", 60);
		System.out.println("class : "+map.getClass());
		Set<Entry<String, Integer>> entry = map.entrySet();
		for (Entry<String, Integer> e : entry) {
			System.out.println("key : "+e.getKey()
			+" value : "+e.getValue());
		}
		System.out.println();
	}

}

class : class java.util.HashMap

key : User2 value : 20

key : User1 value : 60

key : User4 value : 20

key : User3 value : 30

 

class : class java.util.LinkedHashMap

key : User4 value : 20

key : User3 value : 30

key : User2 value : 20

key : User1 value : 60

 

class : class java.util.TreeMap

key : User1 value : 60

key : User2 value : 20

key : User3 value : 30

key : User4 value : 20

 

HashMap : 입력한 순서를 보장하지 않는다.
LinkedHashMap : 키를 기준으로 입력한 순서를 보장한다.
TreeMap : 키 자체의 데이터 값을 기준으로 정렬한다.

 

실무에서는 HashMap을 주로 사용


스택자료구조

 

다음과같이 123 블록이 있다고 가정하자

 

 

블록을 넣고 꺼내려면

3 ->2->1 순서로 꺼내야 할 것임

 

정리하면 다음과 같다.
1(넣기) 2(넣기) 3(넣기) 3(빼기) 2(빼기) 1(빼기)

(후입선출LIFO)

 

자바가 제공하는 스택자료구조를 사용해보자

package javaBasic2.collection.map;

import java.util.Stack;

public class StackMain {
	public static void main(String[] args) {
		Stack<Integer> stack = new Stack<Integer>();
		stack.push(1);
		stack.push(2);
		stack.push(3);
		stack.push(4);
		stack.push(5);
		System.out.println(stack);
		
		System.out.println("\n다음 꺼낼요소확인(꺼내진않음)");
		System.out.println("stack.peek() : "+stack.peek()+"\n");
		
		System.out.println("꺼내기");
		System.out.println("stack.pop() : "+stack.pop());
		System.out.println("stack.pop() : "+stack.pop());
		System.out.println("stack.pop() : "+stack.pop());
		
		System.out.println("\n남은스택");
		System.out.println(stack);
		

	}

}

[1, 2, 3, 4, 5]

 

다음 꺼낼요소확인(꺼내진않음)

stack.peek() : 5

 

꺼내기

stack.pop() : 5

stack.pop() : 4

stack.pop() : 3

 

남은스택

[1, 2]

 

주의!- Stack 클래스는 사용하지 말자
자바의 Stack 클래스는 내부에서 Vector 라는 자료 구조를 사용한다. 이 자료 구조는 자바 1.0에 개발되었는데, 지
금은 사용되지 않고 하위 호환을 위해 존재한다

이후설명하는 Deque를사용하는게 훨씬 좋다


큐 자료구조

 

선입선출(FIFO)

 

 

순서

값 넣기 : offer()

값 뺴기 : poll()

 

1(넣기) 2(넣기) 3(넣기)

1(빼기) 2(빼기) 3(빼기)


컬렉션프레임워크 - Queue

 

Queue 인터페이스는 List , Set 과 같이 Collection 의 자식이다.
Queue 의 대표적인 구현체는 ArrayDeque , LinkedList 가 있다.
Deque 는 조금 뒤에 설명한다.

 

참고로 LinkedList 는 Deque 와 List 인터페이스를 모두 구현한다.

public class LinkedList<E> extends AbstractSequentialList<E>
 implements List<E>, Deque<E>, Cloneable, java.io.Serializable {}

ArrayDeque를 이용해 Queue를 사용해보자

package javaBasic2.collection.map;

import java.util.ArrayDeque;
import java.util.Queue;

public class QueueMain {
	public static void main(String[] args) {
		Queue<Integer> queue = new ArrayDeque<Integer>();
		queue.offer(1);
		queue.offer(3);
		queue.offer(5);
		System.out.println("현재Queue : "+queue);
		
		System.out.println("\n다음에 꺼낼 데이터 꺼내지않고 조회만 ");
		System.out.println(queue.peek()+"\n");
		
		System.out.println("Queue.poll : "+queue.poll());
		System.out.println("Queue.poll : "+queue.poll());
		System.out.println("Queue.poll : "+queue.poll());
		
		System.out.println("\n현재Queue : "+queue);

		
	}

}

현재Queue : [1, 3, 5]

 

다음에 꺼낼 데이터 꺼내지않고 조회만

1

 

Queue.poll : 1

Queue.poll : 3

Queue.poll : 5

 

현재Queue : []


Deque 자료구조

offerFirst() : 앞에 추가한다.
offerLast() : 뒤에 추가한다.
pollFirst() : 앞에서 꺼낸다.
pollLast() : 뒤에서 꺼낸다.

 

Deque 의 대표적인 구현체는 ArrayDeque , LinkedList 가 있다.

코드로보자

package javaBasic2.collection.map;

import java.util.ArrayDeque;
import java.util.Deque;

public class DequeMain {
	public static void main(String[] args) {
		Deque<Integer> deque = new ArrayDeque<Integer>();
		
		System.out.println("deque 넣기");
		deque.offer(2);
		System.out.println(deque);
		deque.offerLast(3);
		System.out.println(deque);
		deque.offerFirst(1);
		System.out.println(deque);
		deque.offerLast(4);
		System.out.println(deque);
		
		
		System.out.println("\ndeque 꺼내지않고 조회만");
		System.out.println("deque.peekFirst() : "+deque.peekFirst());
		System.out.println("deque.peek() : "+deque.peek());
		System.out.println("deque.peekLast() : "+deque.peekLast());
		
		
		System.out.println("\ndeque 꺼내기");
		
		System.out.println("deque.pollLast() : " + deque.pollLast()/* 마지막꺼내기 */);
		
		System.out.println("deque.poll() : "+deque.poll());
		
		System.out.println("deque.pollFirst() : "+deque.pollFirst());

		
		

	}

}

deque 넣기

[2]

[2, 3]

[1, 2, 3]

[1, 2, 3, 4]

 

deque 꺼내지않고 조회만

deque.peekFirst() : 1

deque.peek() : 1

deque.peekLast() : 4

 

deque 꺼내기

deque.pollLast() : 4

deque.poll() : 1

deque.pollFirst() : 2

 

[3]

 

Deque 의 대표적인 구현체는 ArrayDeque , LinkedList 가 있다. 이 둘 중에

 ArrayDeque 가 모든 면에서 더 빠르다.

100만 건 입력(앞, 뒤 평균)
ArrayDeque : 110ms
LinkedList : 480ms


100만 건 조회(앞, 뒤 평균)
ArrayDeque : 9ms
LinkedList : 20ms


Deque와 Stack, Queue

Deque 는 양쪽으로 데이터를 입력하고 출력할 수 있으므로, 

스택과 큐의 역할을 모두 수행할 수 있다.
Deque 를 Stack 과 Queue 로 사용하기 위한 메서드 이름까지 제공한다.

 

stack기능 (LIFO)

push--> 차례로 넣기

pop --> 뒤에서부터 꺼내기

 

Queue기능 (FIFO)

offer --> 차례로넣기poll --> 앞에서 꺼내기

 

 

Deque-stack

package javaBasic2.collection.map;

import java.util.ArrayDeque;

public class Deque_Stack {
	public static void main(String[] args) {
		ArrayDeque<Object> stack = new ArrayDeque<>();
		
		stack.push(1);
		stack.push(2);
		stack.push(3);
		stack.push(4);
		System.out.println("넣은 순서 : 1->2->3->4");
		System.out.println(stack);
		System.out.println();
		
		System.out.println("꺼내기 (LIFO)");
		System.out.println("stack.pop()"+stack.pop());
		System.out.println("stack.pop()"+stack.pop());
		System.out.println("stack.pop()"+stack.pop());
		System.out.println("stack.pop()"+stack.pop());

	}

}

넣은 순서 : 1->2->3->4

[4, 3, 2, 1]

 

꺼내기 (LIFO)

stack.pop()4

stack.pop()3

stack.pop()2

stack.pop()1


Stack - Deque

package collection.deque;
import java.util.ArrayDeque;
import java.util.Deque;
public class DequeQueueMain {
 public static void main(String[] args) {
 Deque<Integer> deque = new ArrayDeque<>();
 //Deque<Integer> deque = new LinkedList<>();
 //데이터 추가
 deque.offer(1);
 deque.offer(2);
 deque.offer(3);
 System.out.println(deque);
 //다음 꺼낼 데이터 확인(꺼내지 않고 단순 조회만)
 System.out.println("deque.peek() = " + deque.peek());
 //데이터 꺼내기
 System.out.println("poll = " + deque.poll());
 System.out.println("poll = " + deque.poll()); System.out.println("poll = " + deque.poll());
 System.out.println(deque);
 }
}

실행 결과 ```
[1, 2, 3]
deque.peek() = 1
poll = 1
poll = 2
poll = 3
[]

 


문제와 풀이1 - Map1

문제1 - 배열을 맵으로 전환
문제 설명
상품의 이름과 가격이 2차원 배열로 제공된다.
다음 예제를 참고해서 2차원 배열의 데이터를 Map<String, Integer> 로 변경해라.
그리고 실행 결과를 참고해서 Map 을 출력해라. 출력 순서는 상관없다.

 

package collection.map.test;
public class ArrayToMapTest {
 public static void main(String[] args) {
 String[][] productArr = {{"Java", "10000"}, {"Spring", "20000"}, {"JPA", 
"30000"}};
 // 주어진 배열로부터 Map 생성 - 코드 작성
 // Map의 모든 데이터 출력 - 코드 작성
 }}
```
실행 결과 ```
제품: Java, 가격: 10000
제품: JPA, 가격: 30000
제품: Spring, 가격: 20000

 

 

정답

package javaBasic2.collection.map.ex;

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

public class Ex1 {
	public static void main(String[] args) {
		String[][] productArr = {{"Java", "10000"}, {"Spring", "20000"}, 
				{"JPA", "30000"}};
		System.out.println(productArr[0][0]);
		System.out.println(productArr[0][1]);
		System.out.println(productArr[1][0]);
		System.out.println(productArr[1][1]);
		
		HashMap<Object,Object> hashMap = new HashMap<>();
		for (String[] s : productArr) {
			hashMap.put(s[0], s[1]);
		}
//		for (int i = 0; i < productArr.length; i++) {
//			hashMap.put(productArr[i][0], productArr[i][1]);
//			
//		} 이거를 향상된 for문을 사용해 위에 처럼활용
		
		Set<Entry<Object,Object>> entrySet = hashMap.entrySet();
		for (Entry<Object, Object> entry : entrySet) {
			System.out.println("제품 : "+entry.getKey()
			+" 가격 : "+entry.getValue());
			
		}

	}

}

 


문제2 - 공통의 합

문제 설명

m1과 m2에 공통으로 들어있는키를 찾고

그값의 합 구하기

package collection.map.test;import java.util.HashMap;
import java.util.Map;
public class CommonKeyValueSum1 {
 public static void main(String[] args) {
 Map<String, Integer> map1 = new HashMap<>();
 map1.put("A", 1);
 map1.put("B", 2);
 map1.put("C", 3);
 Map<String, Integer> map2 = new HashMap<>();
 map2.put("B", 4);
 map2.put("C", 5);
 map2.put("D", 6);
 // 코드 작성
 }
}
```
실행 결과 ```
{B=6, C=8}

 

정답

package javaBasic2.collection.map.ex;

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

public class CommonKeyValueSum {
	public static void main(String[] args) {
		Map<String, Integer> map1 = new HashMap<>();
		map1.put("A", 1);
		map1.put("B", 2);
		map1.put("C", 3);

		Map<String, Integer> map2 = new HashMap<>();
		map2.put("B", 4);
		map2.put("C", 5);
		map2.put("D", 6);

		HashMap<Object,Integer> hashMap = new HashMap<>();
		for (String a : map1.keySet()) {
			if(map2.containsKey(a)) {
				hashMap.put(a, map1.get(a)+map2.get(a));
			}

		}
		System.out.println(hashMap);
	}

}

문제3 - 같은 단어가 나타난 수


문제 설명
각각의 단어가 나타난 수를 출력해라.

 

실행 결과를 참고하자. ```java
package collection.map.test;
import java.util.HashMap;
import java.util.Map;
public class WordFrequencyTest1 {
 public static void main(String[] args) {
 String text = "orange banana apple apple banana apple";
 // 코드 작성
 }
}
```
실행 결과 ```
{orange=1, banana=2, apple=3}

 

 

정답

package javaBasic2.collection.map.ex;

import java.util.HashMap;

public class WordFrequencyTest {
	 public static void main(String[] args) {
		 String text = "orange banana apple apple banana apple";
		 
		 HashMap<String, Integer> map = new HashMap<String, Integer>();
		 String[] words = text.split(" ");
		 for (String s : words) {
			 Integer i = map.get(s); //처음루프를 돌리면 null이 나오게되어있다.
			 if(i==null) {
				 i=0;
			 }
			 i++; //
             (배열에있는 것으로만돌아가는 foreach문이기 때문에 일단하나를 증가시킴)
			 map.put(s, i);//처음루프 : map.put(orrrange , 1)
		}
		 System.out.println(map);
		 
		 }

}

문제4 - 값으로 검색
문제 설명
다음 예제에서 Map 에 들어있는 데이터 중에 값이 1000원인 모든 상품을 출력해라.
실행 결과를 참고하자

package collection.map.test;
import java.util.*;
public class ItemPriceTest {
 public static void main(String[] args) { Map<String, Integer> map = new HashMap<>();
 map.put("사과", 500);
 map.put("바나나", 500);
 map.put("망고", 1000);
 map.put("딸기", 1000);
 // 코드 작성
 }
}
```
실행 결과 ```
[망고, 딸기]

 

정답

package javaBasic2.collection.map.ex;

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

public class ItemPriceTest {
	public static void main(String[] args) { 
		Map<String, Integer> map = new HashMap<>();
		map.put("사과", 500);
		map.put("바나나", 500);
		map.put("망고", 1000);
		map.put("딸기", 1000);
		
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			if(entry.getValue()==1000) {
				System.out.print(entry.getKey()+" ");
				
			}
		}
	}

}

문제와 풀이2 - Map2

 

문제5 - 영어 사전 만들기
문제 설명
영어 단어를 입력하면 한글 단어를 찾아주는 영어 사전을 만들자.

단어와 뜻을 넣어두고

단어를 검색한다.
실행 결과를 참고하자

 

실행 결과 ```

==단어 검색 단계==
찾을 영어 단어를 입력하세요 (종료는 'q'): apple
apple의 뜻: 사과
찾을 영어 단어를 입력하세요 (종료는 'q'): banana
banana의 뜻: 바나나
찾을 영어 단어를 입력하세요 (종료는 'q'): hello
hello은(는) 사전에 없는 단어입니다.
찾을 영어 단어를 입력하세요 (종료는 'q'): q

package javaBasic2.collection.map.ex;

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

public class DictionaryTest {
	public static void main(String[] args) {
		HashMap<Object,Object> book = new HashMap<>();
		book.put("apple","사과");
		book.put("banana","바나나");
		book.put("wartermelon","수박");
		book.put("book","책");
		book.put("fruits","과일");
		
		Scanner scan = new Scanner(System.in);
		
		
		
		while(true) {
			System.out.println("==단어사전==");
			System.out.println("찾을 영단어를 입력하세요");
			String a = scan.nextLine();
			if(book.containsKey(a)) {
				System.out.println(a+" : "+book.get(a));
			}
			else if(a.equals("q")) {
				break;
			}
			else {
				System.out.println("사전에없는단어입니다");
			}
		}

	}
}

==단어사전==

찾을 영단어를 입력하세요

a

사전에없는단어입니다

==단어사전==

찾을 영단어를 입력하세요

app

사전에없는단어입니다

==단어사전==

찾을 영단어를 입력하세요

apple

apple : 사과

==단어사전==

찾을 영단어를 입력하세요

banana

banana : 바나나

==단어사전==

찾을 영단어를 입력하세요

 


문제6 - 회원 관리 저장소
문제 설명
Map 을 사용해서 회원을 저장하고 관리하는 MemberRepository 코드를 완성하자.
Member , MemberRepositoryMain 코드와 실행 결과를 참고하자.

package javaBasic2.collection.map.ex;

public class Member {
	private String id;
	private String name;
	
	public Member(String id , String name) {
		this.id =id;
		this.name = name;
	}

	public String getId() {
		return id;
	}


	public String getName() {
		return name;
	}

	@Override
	public String toString() {
		return "Member [id=" + id + ", name=" + name + "]";
	}

	
		

}
package javaBasic2.collection.map.ex;

public class MemberMain {
	public static void main(String[] args) {
		 Member member1 = new Member("id1", "회원1");
		 Member member2 = new Member("id2", "회원2");
		 Member member3 = new Member("id3", "회원3"); // 회원 저장
		 MemberRepository repository = new MemberRepository();
		 repository.save(member1);
		 repository.save(member2);
		 repository.save(member3);
		 // 회원 조회
		 Member findMember1 = repository.findById("id1");
		 System.out.println("findMember1 = " + findMember1);
		 Member findMember3 = repository.findByName("회원3");
		 System.out.println("findMember3 = " + findMember3);
		 // 회원 삭제
		 repository.remove("id1");
		 Member removedMember1 = repository.findById("id1");
		 System.out.println("removedMember1 = " + removedMember1);
		 }

}

 

 

정답

package javaBasic2.collection.map.ex;


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

public class MemberRepository {
	
	Map<String ,Member> map = new HashMap<>();
	
	public void save(Member member) {
		map.put(member.getId(), member);
	}
	

	public Member findById(String string) {
		return map.get(string);
		}


	public Member findByName(String string) {
		for(Member member : map.values()) {
			if(member.getName().equals(string)) {
				return member;
			}
		}
		return null;
	}


	public void remove(String string) {
		map.remove(string);
		
	}

}

문제7 - 장바구니


문제 설명
장바구니 추가 - add()
장바구니에 상품과 수량을 담는다. 상품의 이름과 가격이 같으면 같은 상품이다.
장바구니에 이름과 가격이 같은 상품을 추가하면 기존에 담긴 상품에 수량만 추가된다.
장바구니에 이름과 가격이 다른 상품을 추가하면 새로운 상품이 추가된다.


장바구니 제거 - minus()
장바구니에 담긴 상품의 수량을 줄일 수 있다. 만약 수량이 0보다 작다면 상품이 장바구니에서 제거된다.
CartMain 과 실행 결과를 참고해서 Product , Cart 클래스를 완성하자.
Cart 클래스는 Map 을 통해 상품을 장바구니에 보관한다.
Map 의 Key는 Product 가 사용되고, Value는 장바구니에 담은 수량이 사용된다.

 

package javaBasic2.collection.map.ex;

public class CartMain {
	public static void main(String[] args) {
		 Cart cart = new Cart();
		 cart.add(new Product("사과", 1000), 1);
		 cart.add(new Product("바나나", 500), 1);
		 cart.printAll();
		 cart.add(new Product("사과", 1000), 2);
		 cart.printAll();
		 cart.minus(new Product("사과", 1000), 3);
		 cart.printAll();
		 }

}

 

 

정답

package javaBasic2.collection.map.ex;

import java.util.Objects;

public class Product {
	private String name;
	private int price;
	
	public Product(String name , int price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}


	public int getPrice() {
		return price;
	}
	

	@Override
	public int hashCode() {
		return Objects.hash(name, price);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Product other = (Product) obj;
		return Objects.equals(name, other.name) && price == other.price;
	}

	@Override
	public String toString() {
		return "Product [name=" + name + ", price=" + price + "]";
	}
	


}
package javaBasic2.collection.map.ex;


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

public class Cart {
	
	Map<Product, Integer> map = new HashMap<>();

	public void add(Product product, int i) {
		if(map.containsKey(product)) {
			map.put(product, map.get(product)+i);
		}
		else {
			map.put(product, i);
		}
	}

	public void printAll() {
		System.out.println("@ 모든상품 출력 @");
		for(Entry<Product, Integer>entry : map.entrySet()) {
			System.out.println("상품 : "+entry.getKey()
			+" 수량 : "+entry.getValue());
		}
		
	}

	public void minus(Product product, int i) {
		Integer a = map.getOrDefault(product, 0);//키에 연결된 값 반환
		int minusCount = a-i;
		if(minusCount<=0) {
			map.remove(product);
			}
		else {
			map.put(product, minusCount);
		}
		
		
	}

}

 

@ 모든상품 출력 @

상품 : Product [name=사과, price=1000]수량 : 1

상품 : Product [name=바나나, price=500]수량 : 1

@ 모든상품 출력 @

상품 : Product [name=사과, price=1000]수량 : 3

상품 : Product [name=바나나, price=500]수량 : 1

@ 모든상품 출력 @

상품 : Product [name=바나나, price=500]수량 : 1