//list의 내용을 순서대로 출력
static void printList(ArrayList<Integer> list) {
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer e = it.next();
String separator;
if (it.hasNext())
separator = "->";
else
separator = "\n";
System.out.print(e+separator);
}
}//printList_end
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner scan = new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.print((i+1)+"번째 숫자를 입력하세요 >> ");
list.add(scan.nextInt());
}
System.out.println("<정렬 전 list>");
printList(list);
Collections.sort(list); //Collections 클래스의 sort 메소드를 이용해 정렬
System.out.println("<정렬 후 list>");
printList(list);
scan.close();
}//main_end
▶ 출력 결과
1번째 숫자를 입력하세요 >> 5
2번째 숫자를 입력하세요 >> 6
3번째 숫자를 입력하세요 >> 8
4번째 숫자를 입력하세요 >> 9
5번째 숫자를 입력하세요 >> 1
<정렬 전 list>
5->6->8->9->1
<정렬 후 list>
1->5->6->8->9
▶ 입력한 값의 인덱스 위치를 찾아보자
System.out.print("입력한 숫자 중 인덱스를 구하고 싶은 값을 입력하시오 >> ");
int num=scan.nextInt();
int index = Collections.binarySearch(list, num)+1;//num의 위치를 찾는다. 1번째부터 5번째까지 있다고 가정하고 +1
System.out.println(num+" <- "+index+"번째 위치에 있다.");
▶ 출력 결과
1번째 숫자를 입력하세요 >> 5
2번째 숫자를 입력하세요 >> 6
3번째 숫자를 입력하세요 >> 7
4번째 숫자를 입력하세요 >> 8
5번째 숫자를 입력하세요 >> 9
입력한 숫자 중 인덱스를 구하고 싶은 값을 입력하시오 >> 8
8 <- 4번째 위치에 있다.
입력 부분 -> 다음과 같이 Person클래스에 스캐너로 입력된 값 저장 -> String name : 이름 (ex, 홍길동) -> int age : 나이 (ex, 30) -> String addr : 주소 (ex, 서울)
=> 해당 Person 객체를 map에 저장 => 키 값은 name
ex, map.put("홍길동",new Person("홍길동", 30, "서울"));
삭제 부분 스캐너로 입력한 값과 객체의 name 변수 값과 동일 할 경우 맵에서 삭제 -> ex, 스캐너로 "홍길동"을 입력하면 name의 변수가 "홍길동"인 map을 제거
출력 부분 -> 콘솔에 '이름 : 홍길동, 나이 : 30, 주소 : 서울' 과 같은 형태로 출력
종료 부분 -> 프로그램 종료
▶ Person 클래스
public class Person {
private String name;
private int age;
private String addr;
Person(String name, int age, String addr){
this.name=name;
this.age=age;
this.addr=addr;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddr() {
return addr;
}
}
▶ main 코드
1) 입력 부분
System.out.print("이름을 입력하세요 >> ");
String name = scan.next();
System.out.print("나이를 입력하세요 >> ");
int age = scan.nextInt();
System.out.print("주소를 입력하세요 >> ");
String addr = scan.next();
map.put(name, new Person(name, age, addr));
2) 삭제 부분
Set<String> keys = map.keySet();//key 값을 순차적으로 접근할 수 있다.
Iterator<String> it = keys.iterator();
System.out.print("삭제할 이름을 입력하세요 >> ");
String rname = scan.next();
while(it.hasNext()){
if(rname.equals(map.get(it.next()).getName())) //입력된 값과 일치하면 삭제
map.remove(rname);
}
※ 위 코드는 Iterator을 이용한 코드이다. 아래 코드로 작성해도 같은 결과를 가져온다.
if(map.containsKey(rname)){
map.remove(rname);
}
3) 출력 부분
Set<String> keys = map.keySet();//key 값을 순차적으로 접근할 수 있다.
Iterator<String> it = keys.iterator();
while(it.hasNext()){
Person p = map.get(it.next());
System.out.print("이름 : " + p.getName());
System.out.print(", 나이 : " + p.getAge());
System.out.println(", 주소 : " + p.getAddr());
}
4) 종료 부분
System.out.println("프로그램 종료");
break;
▶ 출력 결과
1) 입력
(1)입력, (2)삭제, (3)출력, (4)종료 : 1
이름을 입력하세요 >> 홍길동
나이를 입력하세요 >> 30
주소를 입력하세요 >> 서울
2) 입력한 내용 출력
(1)입력, (2)삭제, (3)출력, (4)종료 : 3
이름 : 홍길동, 나이 : 30, 주소 : 서울
컬렉션의 순차 검색을 위해 사용한다. Iterator 객체를 이용하면 인덱스 없이 순차적 검색이 가능하다.
iterator() 메소드 : Iterator 객체 반환
Vector, ArrayList, LinkedList가 상속받는 인터페이스
리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 메소드 포함
▶ Iterator 인터페이스 메소드
메소드
설명
boolean hasNext()
방문할 요소가 남아 있으면 true 리턴
E next()
다음 요소 리턴
void remove()
마지막으로 리턴된 요소를 제거
▶ 예제 1
▷ v 객체에 숫자를 5개 넣고 for문을 이용해 숫자를 출력할 수 있다.
Vector<Integer> v = new Vector<Integer>();
//v 객체에 숫자 5개 넣기
v.add(0);
v.add(1);
v.add(2);
v.add(3);
v.add(4);
for(Integer num:v)
System.out.println(num);
▷ Iterator 객체를 이용하여 인덱스 없이 순차적으로 검색할 수 있다.
Iterator<Integer> it = v.iterator(); //인터페이스
//it 위치를 -1 이라고 생각하면 이해하기 편하다.
while(it.hasNext()){//방문할 요소가 남아 있으면 true를 리턴한다.
System.out.println(it.next());
}
▶ 예제 2
ArrayList<String> 생성
문자열 5개 스캐너로 입력 받아서 저장
Iterator 객체를 통해서 출력
▷ 코드
ArrayList<String> list = new ArrayList<String>();
Scanner scan = new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.print((i+1)+"번째 문자열 입력 >> ");
list.add(scan.next());
}
Iterator<String> itS = list.iterator();
while(itS.hasNext()){
System.out.println(itS.next());
}
scan.close();
▷ 출력 결과
1번째 문자열 입력 >> Kim
2번째 문자열 입력 >> Lee
3번째 문자열 입력 >> Park
4번째 문자열 입력 >> Jo
5번째 문자열 입력 >> Han
Kim
Lee
Park
Jo
Han
오늘은 HashMap과 ArrayList, Iterator를 이용한 심화 문제를 위주로 수업이 진행되었다. HashMap은 Iterator을 상속받지 못했기 때문에 Set을 이용해 key 값을 받아와서 사용하고, ArrayList는 Iterator를 상속받았기 때문에 바로 사용이 가능하다는 차이가 있었다. 처음 컬렉션과 제네릭을 배울 땐 알지 못했는데 오늘 Iterator를 이용해 실습하면서 16일차에 배운 내용을 많이 이해할 수 있었다.
이틀이라는 짧은 시간동안 실습해보았음에도 데이터를 추가하거나 삭제하는 부분에 대해 배열보다 훨씬 편했고, 왜 중요한 파트라고 말씀하셨는지 알 수 있었다. 아직은 완벽하지 않지만 잘 학습해서 내 지식으로 만들고 싶은 욕심이 생긴다.
출력 부분 -> 콘솔에 '이름 : 홍길동, 나이 : 30, 주소 : 서울' 과 같은 형태로 출력
종료 부분 -> 프로그램 종료
▶ 코드
1) 입력 부분
//다음과 같이 map에 스캐너로 입력된 값 저장
HashMap<String,Object> map = new HashMap<String,Object>();
System.out.print("이름을 입력하세요 >> ");
map.put("name", scan.next());
System.out.print("나이를 입력하세요 >> ");
map.put("age", scan.nextInt());
System.out.print("주소을 입력하세요 >> ");
map.put("address", scan.next());
list.add(map); //해당 map을 list에 저장
2) 삭제 부분
//스캐너로 입력한 값과 map의 name value 값과 동일 할 경우 리스트에서 삭제
System.out.print("삭제할 내용을 입력하세요 >> ");
Object obj = scan.next();
for(int i=0;i<list.size();i++){
if(obj.equals(list.get(i).get("name"))){
System.out.println("삭제 - 이름:"+list.get(i).get("name")+", 나이:"+list.get(i).get("age")+", 주소:"+list.get(i).get("address"));
list.remove(i);
break;
} else
System.out.println("해당 이름을 가진 사람이 없어 삭제되지 않았습니다.");
}
(1)입력, (2)삭제, (3)출력, (4)종료 : 1
이름을 입력하세요 >> 홍길동
나이를 입력하세요 >> 30
주소를 입력하세요 >> 서울
(1)입력, (2)삭제, (3)출력, (4)종료 : 1
이름을 입력하세요 >> 유재석
나이를 입력하세요 >> 50
주소를 입력하세요 >> 인천
(1)입력, (2)삭제, (3)출력, (4)종료 : 2
삭제할 내용을 입력하세요 >> 홍길동
삭제 - 이름:홍길동, 나이:30, 주소:서울
(1)입력, (2)삭제, (3)출력, (4)종료 : 3
이름:유재석, 나이:50, 주소:인천
(1)입력, (2)삭제, (3)출력, (4)종료 : 2
삭제할 내용을 입력하세요 >> 박명수
해당 이름을 가진 사람이 없어 삭제되지 않았습니다.
※ 일치하지 않는다면 삭제되지 않는다.
4) 프로그램 종료
(1)입력, (2)삭제, (3)출력, (4)종료 : 4
프로그램이 종료되었습니다.
▶ 전체 코드
ArrayList<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();
Scanner scan = new Scanner(System.in);
//break문을 만날 때까지 무한 반복
while(true){
System.out.print("(1)입력, (2)삭제, (3)출력, (4)종료 : ");
int get = scan.nextInt();
if(get==1){ //입력
//다음과 같이 map에 스캐너로 입력된 값 저장
HashMap<String,Object> map = new HashMap<String,Object>();
System.out.print("이름을 입력하세요 >> ");
map.put("name", scan.next());
System.out.print("나이를 입력하세요 >> ");
map.put("age", scan.nextInt());
System.out.print("주소를 입력하세요 >> ");
map.put("address", scan.next());
list.add(map); //해당 map을 list에 저장
} else if(get==2){ //삭제
//스캐너로 입력한 값과 map의 name value 값과 동일 할 경우 리스트에서 삭제
System.out.print("삭제할 내용을 입력하세요 >> ");
Object obj = scan.next();
for(int i=0;i<list.size();i++){
if(obj.equals(list.get(i).get("name"))){
System.out.println("삭제 - 이름:"+list.get(i).get("name")+", 나이:"+list.get(i).get("age")+", 주소:"+list.get(i).get("address"));
list.remove(i);
break;
} else
System.out.println("해당 이름을 가진 사람이 없어 삭제되지 않았습니다.");
}
} else if(get==3){ //출력
for(int i=0;i<list.size();i++){
System.out.print("이름:"+list.get(i).get("name"));
System.out.print(", 나이:"+list.get(i).get("age"));
System.out.println(", 주소:"+list.get(i).get("address"));
}
} else if(get==4){ //종료
System.out.println("프로그램이 종료되었습니다.");
break;//while_out
}
System.out.println(); //줄바꿈
}//while_end
scan.close();
문제2
입력 부분 -> 다음과 같이 map에 스캐너로 입력된 값 저장 -> key : name, value : 이름 (ex, 홍길동) -> key : age, value : 나이 (ex, 30) -> key : java, value : 자바 점수 (ex, 90), 단 0~100 사이 값이 아니면 다시 입력 -> key : oracle, value : 오라클 점수 (ex, 100), 단 0~100 사이 값이 아니면 다시 입력
=> 해당 map을 list에 저장
삭제 부분 스캐너로 입력한 값과 map의 name value 값과 age value값이 둘다 동일할 경우 리스트에서 삭제
//name value 값과 age value값이 둘다 동일 할 경우 리스트에서 삭제
System.out.print("삭제할 이름과 나이를 정확히 입력하세요 ex)홍길동 30 >> ");
String name = scan.next();
Object age = scan.nextInt();
for(int i=0;i<list.size();i++){
if(name.equals(list.get(i).get("name")) && age == list.get(i).get("age")){
System.out.println("삭제 - 이름:"+list.get(i).get("name")+", 나이:"+list.get(i).get("age")+", 자바 점수:"+list.get(i).get("java")+", 오라클 점수:"+list.get(i).get("oracle"));
list.remove(i);
break;
} else
System.out.println("해당 정보와 일치하는 사람이 없어 삭제되지 않았습니다.");
}
(1)입력, (2)삭제, (3)출력, (4)종료 : 1
이름을 입력하세요 >> 홍길동
나이를 입력하세요 >> 30
자바 점수를 입력하세요 >> 55
오라클 점수를 입력하세요 >> 77
(1)입력, (2)삭제, (3)출력, (4)종료 : 1
이름을 입력하세요 >> 유재석
나이를 입력하세요 >> 50
자바 점수를 입력하세요 >> -1
0부터 100까지의 숫자를 입력해야합니다.
자바 점수를 입력하세요 >> 0
오라클 점수를 입력하세요 >> 101
0부터 100까지의 숫자를 입력해야합니다.
오라클 점수를 입력하세요 >> 100
2) 입력한 리스트 내용 출력
(1)입력, (2)삭제, (3)출력, (4)종료 : 3
이름:홍길동, 나이:30, 자바 점수:55, 오라클 점수:77
이름:유재석, 나이:50, 자바 점수:0, 오라클 점수:100
3) 스캐너로 입력한 값과 map의 name value 값과 age value값이 모두 일치할 경우 리스트에서 삭제
(1)입력, (2)삭제, (3)출력, (4)종료 : 2
삭제할 이름과 나이를 정확히 입력하세요 ex)홍길동 30 >> 홍길동 30
삭제 - 이름:홍길동, 나이:30, 자바 점수:55, 오라클 점수:77
(1)입력, (2)삭제, (3)출력, (4)종료 : 3
이름:유재석, 나이:50, 자바 점수:0, 오라클 점수:100
(1)입력, (2)삭제, (3)출력, (4)종료 : 2
삭제할 이름과 나이를 정확히 입력하세요 ex)홍길동 30 >> 유재석 49
해당 정보와 일치하는 사람이 없어 삭제되지 않았습니다.
(1)입력, (2)삭제, (3)출력, (4)종료 : 3
이름:유재석, 나이:50, 자바 점수:0, 오라클 점수:100
※ 모두 일치하지 않는다면 삭제되지 않는다.
4) 프로그램 종료
(1)입력, (2)삭제, (3)출력, (4)종료 : 4
프로그램 종료
▶ 전체 코드
//점수를 확인 및 입력하는 메소드
//static으로 선언해야 호출 가능. 입력받은 점수를 반환해야하기 때문에 int형으로 반환한다.
static int score(Scanner s, String str){
int num;
while(true){
System.out.print(str + " 점수를 입력하세요 >> ");
num = s.nextInt();
if(num>=0 && num <=100)
break;
else
System.out.println("0부터 100까지의 숫자를 입력해야합니다.\n"); //줄바꿈
}
return num;
}
public static void main(String[] args) {
ArrayList<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();
Scanner scan = new Scanner(System.in);
while(true){
System.out.print("(1)입력, (2)삭제, (3)출력, (4)종료 : ");
int get = scan.nextInt();
if(get==1){
//입력
HashMap<String,Object> map = new HashMap<String,Object>();
System.out.print("이름을 입력하세요 >> ");
map.put("name",scan.next());
System.out.print("나이를 입력하세요 >> ");
map.put("age",scan.nextInt());
map.put("java",score(scan,"자바"));
map.put("oracle",score(scan,"오라클"));
list.add(map);
} else if(get==2){
//name value 값과 age value값이 둘다 동일 할 경우 리스트에서 삭제
System.out.print("삭제할 이름과 나이를 정확히 입력하세요 ex)홍길동 30 >> ");
String name = scan.next();
Object age = scan.nextInt();
for(int i=0;i<list.size();i++){
if(name.equals(list.get(i).get("name")) && age == list.get(i).get("age")){
System.out.println("삭제 - 이름:"+list.get(i).get("name")+", 나이:"+list.get(i).get("age")+", 자바 점수:"+list.get(i).get("java")+", 오라클 점수:"+list.get(i).get("oracle"));
list.remove(i);
break;
} else
System.out.println("해당 정보와 일치하는 사람이 없어 삭제되지 않았습니다.");
}
} else if(get==3){
//출력
for(int i=0;i<list.size();i++){
System.out.print("이름:"+list.get(i).get("name"));
System.out.print(", 나이:"+list.get(i).get("age"));
System.out.print(", 자바 점수:"+list.get(i).get("java"));
System.out.println(", 오라클 점수:"+list.get(i).get("oracle"));
}
} else if(get==4){
System.out.println("프로그램 종료");
break;//while_out
}
System.out.println(); //줄바꿈
}//while_end
}//main_end
배열 사용 없이 맵 하나만 사용하기 위해 반복문 안에 HashMap을 선언하였다. 밖에서 객체 생성을 하면 마지막 값으로만 값이 저장된다.
▶ 출력 결과
이름을 입력하세요 >> 홍길동
나이를 입력하세요 >> 30
성별을 입력하세요(남/여) >> 남
주소를 입력하세요 >> 서울
이름을 입력하세요 >> 유재석
나이를 입력하세요 >> 50
성별을 입력하세요(남/여) >> 남
주소를 입력하세요 >> 인천
이름을 입력하세요 >> 박명수
나이를 입력하세요 >> 40
성별을 입력하세요(남/여) >> 여
주소를 입력하세요 >> 경기도
<list>
이름:홍길동, 나이:30, 성별:남, 주소:서울
이름:유재석, 나이:50, 성별:남, 주소:인천
이름:박명수, 나이:40, 성별:여, 주소:경기도