Backend/JAVA

JAVA 코딩 API (Application Programming Interface) - Map

쏠솔랄라 2023. 3. 4. 22:27

 

 

API - Map, HashMap

 

import java.security.KeyStore.Entry;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

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

// Map<Integer, int[]> map = new HashMap<>(); 
// 2차원밸류

Map<String, Integer> map = new HashMap<>();

System.out.println(map.put("a", 100));
System.out.println(map.get("a"));

System.out.println(map.put("a", 1000));
System.out.println(map.put("a", 50));

System.out.println(map.get("a"));

// key 값은 중복이 안 되고 value값은 중복이 된다

map.put("b", 10);
map.put("c", 10);
map.put("d", 20);

System.out.println(map.size());

System.out.println(map.containsKey("a"));
System.out.println(map.containsKey(30));

System.out.println(map.containsValue("a")); // a값의 value는 없으므로 false
System.out.println(map.containsValue(50)); // 50값의 value는 값이 입력되어 있기 때문에 true


// 데이터 추출
Set<String> set = map.keySet();
// key값을 set값으로 받아들이는 것

Iterator<String> it = set.iterator();

// while(it.hasNext()) {
// String key = it.next();
// int value = map.get(key);
// System.out.println(key + " : " + value);
// }

map.remove(it); // value값 반환
map.remove(set, it); // vaule값과 key값을 모두 반환
}
}

 

 


 

 

Exercise 1

 

[도서 등록 프로그램 구현]
사용자에게 계속해서 도서명을 입력받아 저장하는 저장소를 구현
이미 등록된 책이면 등록을 거절해야 함

(예상 결과)
도서명 : 어린 왕자
도서가 등록되었습니다. - 현재 도서 1개
도서명 : 키다리 아저씨
도서가 등록되었습니다. - 현재 도서 2개
도서명 : 어린 왕자
이미 등록된 도서입니다.
도서명 : 종료
프로그램을 종료합니다.

 

// ArrayList를 이용해 풀기

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Scanner;

 

public class Main {

 

public static void main (String[] args) {

 

List<String> list = new ArrayList<String>();

Scanner sc = new Scanner(System.in);

 

while (true) {

System.out.print("등록할 도서를 입력하세요.\n도서 등록이 완료된 경우[종료]를 입력하세요.\n도서명 : ");

String book = sc.nextLine();

if (book == null) {

System.out.println("데이터가 없습니다. 도서를 입력하세요.");

} else if (book.equals("종료")) {

System.out.println("프로그램이 종료되었습니다.");

break;

} else if (list.contains(book)) {

System.out.println("이미 등록된 도서입니다.");

} else {

list.add(book);

System.out.println("도서가 등록되었습니다. - 현재 도서 " + list.size() + "개");

System.out.println(list);

}

System.out.println();

}

sc.close();

}

}

 

 

출력화면

 

 

// HashMap을 이용해 풀기

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Scanner;

public class Main2 {

 

public static void main (String[] args) {

 

 

Map<String, Integer> map = new HashMap<String, Integer>();

Scanner sc = new Scanner(System.in);

 

while (true) {

 

if (map.isEmpty()) {

System.out.println("데이터가 없습니다.");

} else {

for (Entry<String, Integer> en : map.entrySet()) {

// Set<Map.Entry<K,V>> entrySet() ; Returns a Set view of the mappings contained in this map.

System.out.println(en.getKey() + " : " + en.getValue() + "원");

}

}

System.out.println();

System.out.print("도서명 : ");

String name = sc.next();

sc.nextLine();

 

if (name.equals("종료")) {

System.out.println("프로그램을 종료합니다.");

break;

} else if (map.containsKey(name)) {

System.out.println("이미 등록된 도서입니다.");

} else {

System.out.print("가격 입력 : ");

int price = sc.nextInt();

map.put(name, price);

System.out.println("도서가 등록되었습니다.\n현재 도서 : " + map.size() + "권");

}

}

sc.close();

}

}

 

 


 

Exercise 2

 

 

[전화번호부 만들기]

<한 사람의 정보>
이름
전화번호 (무한대로 저장 가능해야 한다)
- 모바일, 직장, 집
- 전화번호

그룹 : 가족, 친구, 직장, 조, ... 입력 추가 수정 삭제 검색
- 그룹별 검색(그룹명 검색)
- 이름 포함검색
- 전화번호 포함검색

 

// class Main

public class Main {

public static void main(String[] args) {

new Controller();

}

}

 

// class Controller

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Scanner;

import java.util.Set;

import javax.swing.GroupLayout.Group;

public class Controller {

private Map<String, List<Person>> map = new HashMap<>();

private List<String> groups = new ArrayList<>();

private Scanner sc = new Scanner(System.in);

 

public Controller() {

List<Person> list = new ArrayList<>();

Person p1 = new Person("김민준");

p1.addPhoneNumber(new PhoneNumber("핸드폰", "010-3666-6768"));

p1.addPhoneNumber(new PhoneNumber("집", "052-1234-1234"));

list.add(p1);

map.put("학원", list);

 

list = new ArrayList<>();

Person p2 = new Person("콩벌레");

p2.addPhoneNumber(new PhoneNumber("핸드폰", "010-3666-6777"));

p2.addPhoneNumber(new PhoneNumber("집", "02-364-4598"));

list.add(p2);

map.put("사육", list);

 

groups.add("학원");

groups.add("사육");

 

menu();

}

 

private int inputInt(String msg) {

System.out.print(msg + "\n입력 : ");

int select = sc.nextInt();

return select;

}

 

private String inputString(String msg) {

System.out.print(msg + " 입력 : ");

return sc.next();

}

 

private void exit() {

System.out.println("프로그램이 종료됩니다.");

sc.close();

System.exit(0);

}

 

private void menu() {

while(true) {

int select = inputInt("1.입력 2.검색 3.수정 4.삭제 5.종료");

 

switch(select) {

case 1:

insert();

break;

case 2:

select();

break;

case 3:

update();

break;

case 4:

delete();

break;

case 5:

exit();

default:

System.out.println("잘못된 메뉴!");

}

}

}

 

private int dispGroup(boolean mode) {

if(groups.isEmpty()) {

System.out.println("저장된 정보가 없습니다.");

return 0;

}

String li = "";

 

for(int i = 0; i < groups.size(); i++) {

li += i + 1 + "." + groups.get(i) + "\n";

}

 

int size = groups.size();

 

if(!mode) {

li += groups.size() + 1 + "." + "그룹 추가";

size++;

}

 

int select = 0;

do {

select = inputInt(li);

}while(select < 1 || select > size);

 

return select;

 

}

 

private void insert() {

String name = inputString("이름");

int gs = dispGroup(false);

List<Person> list = null;

 

String group = null;

if(gs == 0 || gs == groups.size() + 1) {

group = inputString("그룹");

if(groups.indexOf(group) != -1) {

System.out.println("그룹이 존재 합니다.처음으로...");

return;

}

list = new ArrayList<>();

 

}else {

group = groups.get(gs - 1);

list = map.get(group);

}

 

List<PhoneNumber> pnList = new ArrayList<>();

while(true) {

String kind = inputString("종류");

String number = inputString("전화번호");

 

pnList.add(new PhoneNumber(kind, number));

 

int an = inputInt("계속 하시겠습니까?(1.계속 2.종료)");

if(an == 2) {

break;

}else if(an < 1 || an > 2) {

System.out.println("잘못된 입력! 처음으로...");

return;

}

}

 

list.add(new Person(name, pnList));

 

map.put(group, list);

if(groups.indexOf(group) == -1) {

groups.add(group);

}

System.out.println("정보 입력 성공!");

}

 

private void select() {

while(true) {

int select = inputInt("1. 전체검색 2.그룹검색 3.이름검색 4.전화번호검색 5.이전");

switch(select) {

case 1:

allDisp();

break;

case 2:

selectGroup();

break;

case 3:

selectName();

break;

case 4:

selectNumber();

break;

case 5:

return;

default:

System.out.println("잘못된 입력 : ");

}

}

}

 

private void allDisp() {

for(String group : groups) {

List<Person> list = map.get(group);

System.out.println("====" + group + "====");

for(Person ps : list) {

System.out.println(ps);

}

}

}

 

private void selectGroup() {

int select = dispGroup(true);

System.out.println("====" + groups.get(select-1) + "====");

 

for(Person ps : map.get(groups.get(select-1))) {

System.out.println(ps);

}

}

 

private void selectMode(String str,int mode) {

for(String group : groups) {

List<Person> list = map.get(group);

System.out.println("====" + group + "====");

boolean check = true;

for(Person ps : list) {

if(mode == 1) {

if(ps.includeName(str)) {

System.out.println(ps);

check = false;

}

}else if(mode == 2) {

if(ps.findNumberDisp(str)) {

System.out.println(ps);

check = false;

}

}

}

if(check) {

System.out.println("그룹에 이름이 없습니다.");

}

}

}

 

private void selectName() {

String name = inputString("검색할 이름");

for(String group : groups) {

List<Person> list = map.get(group);

System.out.println("====" + group + "====");

boolean check = true;

for(Person ps : list) {

if(ps.includeName(name)) {

System.out.println(ps);

check = false;

}

}

if(check) {

System.out.println("그룹에 이름이 없습니다.");

}

}

}

 

private void selectNumber() {

String number = inputString("검색할 전화번호");

for(String group : groups) {

List<Person> list = map.get(group);

System.out.println("====" + group + "====");

boolean check = true;

for(Person ps : list) {

if(ps.findNumberDisp(number)) {

System.out.println(ps);

check = false;

}

}

if(check) {

System.out.println("그룹에 이름이 없습니다.");

}

}

}

 

public Person searchName(String name,int group) {

Person ps = null;

List<Person> list = map.get(groups.get(group - 1));

for(Person p : list) {

if(p.findName(name)) {

ps = p;

break;

}

}

return ps;

}

 

public void update() {

String name = inputString("수정할 이름");

int group = dispGroup(true);

Person ps = searchName(name, group);

if(ps == null) {

System.out.println("검색한 사람이 존재하지 않습니다!");

return;

}

System.out.println(ps);

while(true) {

int select = inputInt("1.이름수정 2.전화번호수정 3.이전");

switch(select) {

case 1:

updateName(ps);

break;

case 2:

updatePhoneNumber(ps);

break;

case 3:

return;

default:

System.out.println("잘못된 메뉴 입력!");

}

}

}

private void updateName(Person ps) {

String name = inputString("수정할 이름");

ps.setName(name);

System.out.println("이름을 수정하였습니다.");

}

 

private void updatePhoneNumber(Person ps) {

ps.listDisp();

int select = inputInt("1.추가 2.수정 3.삭제 4.이전");

switch(select) {

case 1:

addNumber(ps);

break;

case 2:

updateNumber(ps);

break;

case 3:

deleteNumber(ps);

break;

case 4:

return;

default:

System.out.println("잘못된 메뉴 입력!");

}

}

private void addNumber(Person ps) {

String kind = inputString("종류");

String number = inputString("전화번호");

 

ps.addPhoneNumber(new PhoneNumber(kind, number));

 

System.out.println("전화번호가 추가되었습니다.");

}

 

public void updateNumber(Person ps) {

 

int select = pnSelect(ps, "수정");

if(select == -1) {

return;

}

 

String kind = inputString("수정할 종류");

String number = inputString("수정할 전화번호");

 

ps.updatePhoneNumber(new PhoneNumber(kind, number), select - 1);

 

System.out.println("수정되었습니다.");

 

}

 

public int pnSelect(Person ps,String str) {

ps.listDisp();

int select = inputInt(str + "할 번호");

if(select < 1 || select > ps.getPnListSize()) {

System.out.println("잘못된 번호 입력!");

return -1;

}

return select;

}

 

public void deleteNumber(Person ps) {

int select = pnSelect(ps, "삭제");

if(select == -1) {

return;

}

ps.deletePhoneNumber(select - 1);

System.out.println("삭제되었습니다.");

}

 

private void delete() {

String name = inputString("삭제할 이름");

int group = dispGroup(true);

 

Person ps = null;

List<Person> list = map.get(groups.get(group - 1));

for(int i = 0; i < list.size(); i++) {

if(list.get(i).findName(name)) {

list.remove(i);

break;

}

}

}

}

 

// class Person
import java.util.ArrayList;
import java.util.List;

public class Person {
private String name;
private List<PhoneNumber> pnList = new ArrayList<>();

public Person(String name,List<PhoneNumber> pnList) {
this.name = name;
this.pnList = pnList;
}

public Person() {

}

public Person(String name) {
this.name = name;
}

public void setName(String name) {
this.name = name;
}

public void setPnList(List<PhoneNumber> pnList) {
this.pnList = pnList;
}

public String getName() {
return name;
}

public List<PhoneNumber> getPnList(){
return pnList;
}

public void addPhoneNumber(PhoneNumber pn) {
pnList.add(pn);
}

public void updatePhoneNumber(PhoneNumber pn,int i) {
pnList.set(i, pn);
}

public void deletePhoneNumber(int i) {
pnList.remove(i);
}

public int getPnListSize() {
return pnList.size();
}

public void listDisp() {
System.out.println("종류\t전화번호");
for(int i = 0; i < pnList.size(); i++) {
System.out.println("[" + (i + 1) + "] " + pnList.get(i));
}
}

@Override
public String toString() {

String info = "이름 : " + name + "\n";
info+="종류\t전화번호\n";
for(int i = 0; i < pnList.size(); i++) {
info+=pnList.get(i) + "\n";
}

return info;
}

public boolean findName(String name) {
if(this.name.equals(name)) {
return true;
}
return false;
}

public boolean includeName(String name) {
return this.name.contains(name);
}

public List<PhoneNumber> findKindList(String kind){
List<PhoneNumber> list = new ArrayList<>();

for(PhoneNumber pn : pnList) {
if(pn.findNumber(kind)) {
list.add(pn);
}
}

return list;
}

public void listDisp(List<PhoneNumber> list) {
if(list.isEmpty()) {
System.out.println("저장된 데이터가 없습니다.");
}else {
System.out.println("종류\t전화번호");
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}

public boolean findNumberDisp(String number) {
for(PhoneNumber pn : pnList) {
if(pn.includeNumber(number)) {
return true;
}
}
return false;
}
}


// class PhoneNumber

public class PhoneNumber {

private String kind;

private String number;

 

public PhoneNumber(String kind,String number) {

this.kind = kind;

this.number = number;

}

 

public void setKind(String kind) {

this.kind = kind;

}

 

public void setNumber(String number) {

this.number = number;

}

 

public String getKind() {

return kind;

}

public String getNumber() {

return number;

}

 

public boolean findNumber(String kind) {

if(kind.equals(this.kind)) {

return true;

}

return false;

}

 

public boolean includeNumber(String number) {

if(this.number.indexOf(number) == -1) {

return false;

}else {

return true;

}

}

 

@Override

public String toString() {

return kind + " : " + number;

}

}