본문 바로가기

Java 웹 개발

21.09.10 - 웹 개발 입문 23일차

Collection - 확장foreach 구문

확장 반복(foreach)문
전체를 편하게 꺼낼 수 있는 반복문
일부분은 꺼낼 수 없음
index가 필요하지 않음(알 수 없음)
Iterable을 상속받은 클래스는 모두 foreach 구문을 사용할 수 있다.

 

- 일반적인 반복문으로 출력

package api.collection;

import java.util.ArrayList;
import java.util.List;

public class Test04_1 {
	public static void main(String[] args) {
		//Generic type 에는 클래스만 작성할 수 있다(only 참조형)
		List<Integer> list = new ArrayList<>();

		list.add(12);
		list.add(21);
		list.add(22);
		list.add(30);
		list.add(35);
		list.add(36);

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

 

- 확장 반복문으로 출력

package api.collection;

import java.util.ArrayList;
import java.util.List;

public class Test04_2 {
	public static void main(String[] args) {
		//Generic type 에는 클래스만 작성할 수 있다(only 참조형)
		List<Integer> list = new ArrayList<>();

		list.add(12);
		list.add(21);
		list.add(22);
		list.add(30);
		list.add(35);
		list.add(36);
        
		//확장 반복(foreach)문
		for(int n : list) {
			System.out.println(n);
		}
	}
}

 

 

Collection - 셔플, 리버스, 정렬

Collections 클래스를 이용한 List 보조 처리

package api.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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

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

		for (int i = 1; i <= 45; i++) {
			list.add(i);
		}

		System.out.println(list);

		//순서 반대로 바꾸기(reverse)
		Collections.reverse(list);
		System.out.println(list);

		//순서 랜덤으로 섞기(shffle)
		Collections.shuffle(list);
		System.out.println(list);

		//순서대로 정렬(sort)
		Collections.sort(list);
		System.out.println(list);
	}
}

 

Q. 이번 주 로또번호 추첨 - 1부터 45사이의 숫자 6개   -  복원 추출 방법

package api.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

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

		Random r = new Random();
		List<Integer> lotto = new ArrayList<>();

		for(int i=0; i < 6; i++) {
			int number = r.nextInt(45) + 1;
//			if(lotto.contains(number) == false) {
			if(!lotto.contains(number)) {
				lotto.add(number);
			}
			else {
				i--;
			}
		}

		Collections.sort(lotto);
//		System.out.println(lotto);
		for(int number : lotto) {
			System.out.println(number);
		}
	}
}

6
8
10
14
35
39

 

Q. 이번 주 로또번호 추첨 - 1부터 45사이의 숫자 6개   -  비복원 추출 방법

package api.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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

		List<Integer> bowl = new ArrayList<>();
		for(int i=1; i <=45; i++) {
			bowl.add(i);//auto-boxing 코드(int ---> Integer)
		}

		Collections.shuffle(bowl);
		System.out.println(bowl);

		//앞에서 6개를 잘라내서 새롭게 보관
		List<Integer> lotto = bowl.subList(0, 6);
		System.out.println(lotto.getClass());

		Collections.sort(lotto);
		System.out.println(lotto);

	}
}

[4, 9, 18, 23, 35, 36]

 

 

 

선형 구조 - List 비교

시작과 끝이 있는 구조

 

 

 

Q. 네이버 사타리타기 구현
네이버 사다리타기 게임을 해보시면서 게임에 필요한 그래픽을 제외한 나머지 화면들을 구현하세요
필요한 정보는 사용자에게 입력받으시기 바랍니다.

 

package api.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

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

		// 1. 인원수 설정
		Scanner sc = new Scanner(System.in);
		System.out.print("인원 수 설정 : ");
		int size = sc.nextInt();
		sc.nextLine();// 엔터 제거

		if (size < 2 || size > 24) {
			System.err.println("인원을 2명 이상 24명 이하로 설정하세요");
			System.exit(-1);// 비정상종료
		}

		// 2. 이름 입력 및 항목 입력
		List<String> names = new ArrayList<>(size);
		List<String> events = new ArrayList<>(size);

		for (int i = 0; i < size; i++) {
			System.out.print("이름 입력 : ");
			String name = sc.nextLine();
			names.add(name);
		}

		for (int i = 0; i < size; i++) {
			System.out.print("항목 입력 : ");
			String event = sc.nextLine();
			events.add(event);
		}
		sc.close();

		Collections.shuffle(events);

		for (int i = 0; i < size; i++) {
			System.out.print(names.get(i));
			System.out.print(" → ");
			System.out.print(events.get(i));
			System.out.println();
		}

	}
}

인원 수 설정 : 4
이름 입력 : 가
이름 입력 : 나
이름 입력 : 다
이름 입력 : 라
항목 입력 : 1
항목 입력 : 2
항목 입력 : 3
항목 입력 : 4
가 → 4
나 → 3
다 → 1
라 → 2

 

 

 

Collection - 객체 저장

Q. 학생을 저장할 List 구현

package api.collection;

import java.util.Objects;

public class Student {
	public String getName() {
		return name;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", score=" + score + "]";
	}
	public Student(String name, int score) {
		super();
		this.name = name;
		this.score = score;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int hashCode() {
		return Objects.hash(name, score);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		return Objects.equals(name, other.name) && score == other.score;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	private String name;
	private int score;
}
package api.collection;

import java.util.ArrayList;
import java.util.List;

public class Test09 {
	public static void main(String[] args) {
		
		// List 생성
		List<Student> list = new ArrayList<>();

		// 데이터 추가 - add()
		// list.add("피카츄", 50);//String, int --> error
		list.add(new Student("피카츄", 50));// Student
		list.add(new Student("라이츄", 70));
		list.add(new Student("파이리", 85));

		// 출력
		System.out.println(list);
		for (int i = 0; i < list.size(); i++) {
			Student s = list.get(i);
			System.out.println(s.getName() + ", " + s.getScore());
		}

		for (Student s : list) {
			System.out.println(s.getName() + ", " + s.getScore());
		}

		// 개수확인
		System.out.println(list.size());

		// 검색
		// = 우리가 만든 클래스는 동등 비교가 정의되어 있지 않다.
		// = 반복문을 통해서 이름이나 점수등을 비교하든가
		// = 동등비교(equals)를 정의하면 된다.
		System.out.println(list.contains("피카츄"));
		System.out.println(list.contains(new Student("피카츄", 50)));

		System.out.println(list.indexOf(new Student("피카츄", 50)));

		// 삭제
		// = index를 이용하여 삭제하는 방법은 가능하다.
		// = 데이터를 이용하여 삭제하려면 동등비교(equals) 정의가 필요
		list.remove(new Student("피카츄", 50));
		list.remove(1);

		System.out.println(list.size());
	}
}

[Student [name=피카츄, score=50], Student [name=라이츄, score=70], Student [name=파이리, score=85]]
피카츄, 50
라이츄, 70
파이리, 85
피카츄, 50
라이츄, 70
파이리, 85
3
false
true
0
1

 

 

 

Q. 다음 데이터들을 `Member`라는 클래스와 `ArrayList`를 이용하여 저장한 뒤 문제를 푸세요
- 첫 번째 회원 : (아이디 : student) , (비밀번호 : student1234) , (닉네임 : 수강생)
- 두 번째 회원 : (아이디 : teacher) , (비밀번호 : teacher1234) , (닉네임 : 강사)
- 세 번째 회원 : (아이디 : master) , (비밀번호 : master1234) , (닉네임 : 관리자)
사용자에게 아이디와 비밀번호를 입력받아 로그인을 수행하는 프로그램을 구현하세요.

저장소에 해당 아이디와 비밀번호를 가진 데이터가 존재하면 닉네임을 이용하여 다음과 같이 출력
[닉네임]님 어서오세요!
저장소에 해당 아이디와 비밀번호를 가진 데이터가 존재하지 않으면 다음과 같이 출력
해당 정보가 존재하지 않습니다.

package api.collection;

import java.util.Objects;

public class Member {
	private String id;
	private String password;
	private String nickname;

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

	public Member(String id, String password, String nickname) {
		super();
		this.id = id;
		this.password = password;
		this.nickname = nickname;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public Member(String id, String password) {
		super();
		this.id = id;
		this.password = password;
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, password);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Member other = (Member) obj;
		return Objects.equals(id, other.id) && Objects.equals(password, other.password);
	}
}
package api.collection;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

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

		// 입력
		List<Member> db = new ArrayList<>();
		// db.add("student", "student1234", "수강생");
		db.add(new Member("student", "student1234", "수강생"));
		db.add(new Member("teacher", "teacher1234", "강사"));
		db.add(new Member("master", "master1234", "관리자"));

		Scanner sc = new Scanner(System.in);
		System.out.print("아이디를 입력하세요 : ");
		String id = sc.next();
		System.out.print("비밀번호를 입력하세요 : ");
		String password = sc.next();
		sc.close();

		// List의 기능을 활용하여 로그인 판정을 수행(equals, hashCode를 재정의해야함)
		Member user = new Member(id, password);

		int index = db.indexOf(user);// user의 위치를 찾는다
//		System.out.println("index = " + index);

		if (index >= 0) {
			Member find = db.get(index);
			System.out.println("[" + find.getNickname() + "]님 환영합니다!");
		} else {
			System.out.println("정보가 일치하지 않습니다");
		}

	}
}

아이디를 입력하세요 : master
비밀번호를 입력하세요 : master1234
[관리자]님 환영합니다!

 

 

 

Q. 오디션 투표 프로그램
등록된 후보(Artist)들에 대한 정보를 저장소에 저장하시고 
사용자에게 이름을 입력받아 투표를 진행하는 프로그램을 구현
투표수는 최초에 0으로 설정되며, 
사용자가 이름을 입력하면 있을 경우 투표수 1 증가, 없으면 없다는 메세지를 화면에 출력
사용자가 "그만" 이라고 입력하면 투표를 종료하면서 투표 결과를 화면에 출력 

- 후보 정보
- 이름 : 녹두 , 포지션 : 보컬 , 투표수 : 0
- 이름 : 대니구 , 포지션 : 바이올린 , 투표수 : 0
- 이름 : 제이유나 , 포지션 : 보컬 , 투표수 : 0
- 이름 : 박다울 , 포지션 : 거문고 , 투표수 : 0
- 이름 : 황린 , 포지션 : 일렉기타 , 투표수 : 0

<예시>
투표할 이름 입력 : 피카츄
그런 사람은 없습니다.
투표할 이름 입력 : 박다울
[박다울]님에게 투표가 완료되었습니다.
투표할 이름 입력 : 황린
[황린]님에게 투표가 완료되었습니다.
투표할 이름 입력 : 그만
투표가 종료되었습니다.
<투표 결과>
이름 : 녹두 , 포지션 : 보컬 , 투표수 : 0
이름 : 대니구 , 포지션 : 바이올린 , 투표수 : 0
이름 : 제이유나 , 포지션 : 보컬 , 투표수 : 0
이름 : 박다울 , 포지션 : 거문고 , 투표수 : 1
이름 : 황린 , 포지션 : 일렉기타 , 투표수 : 1

 

package api.collection;

import java.util.Objects;

public class Artist implements Comparable<Artist> {
	// 멤버 변수(필드)
	private String name;
	private String position;
	private int count;

	// setter & getter
	public String getName() {
		return name;
	}

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

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public Artist(String name, String position) {
		super();
		this.name = name;
		this.position = position;
//		this.count = 0;
	}

	@Override
	public String toString() {
		return "Artist [name=" + name + ", position=" + position + ", count=" + count + "]";
	}

	public void vote() {
		this.count++;
	}

//	이름이 같으면 같은 대상이라는 비교기준을 설정하고 싶으면
//	--> equals & hashCode
	@Override
	public int hashCode() {
		return Objects.hash(name);
	}

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

	public Artist(String name) {
		super();
		this.name = name;
	}

//	정렬 기준을 내장시키고 싶다면
//	--> Comparable 상속 후 compareTo 재정의
	@Override
	public int compareTo(Artist other) {
		if (this.getCount() == other.getCount()) {// 투표수가 같으면
			return this.getName().compareTo(other.getName());// 이름 오름차순
		} else {// 투표수가 다르면
			return other.getCount() - this.getCount();// 투표수 내림차순
		}
	}

}

 

(1) 투표수 증가 시키기

package api.collection;

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

		Artist a = new Artist("대니구", "바이올린");
		System.out.println(a);

		// 투표 수 1 증가
		// a.count++;
		int count = a.getCount();
		a.setCount(count + 1);
		System.out.println(a);

		// vote() 메소드를 부르면 투표수가 1 증가
		a.vote();
		System.out.println(a);

	}
}

Artist에 메소드 추가하기

public void vote() {
this.count++;
}

 

 

(2) 5명의 아티스트들을 리스트에 등록한 뒤 출력

package api.collection;

import java.util.ArrayList;
import java.util.List;

public class Test11_1 {
	public static void main(String[] args) {
		
		List<Artist> list = new ArrayList<>();

		//추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		//출력
		for(int i=0; i < list.size(); i++) {
			Artist art = list.get(i);
			System.out.println(art);
		}

		System.out.println();

		for(Artist art : list) {
			System.out.println(art);
		}
	}
}

 

 

(3) 저장되어있는 아티스트들을 "이름"으로 찾기

package api.collection;

import java.util.ArrayList;
import java.util.List;

public class Test11_2 {
	public static void main(String[] args) {
		
		List<Artist> list = new ArrayList<>();

		// 추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		// 검색
		String name = "황린";

		// 1. 비어있는 리모컨을 준비
		Artist find = null;

//		if(0번 위치에 있는 Artist 의 이름이 name과 같다면) {
//			find = 0번 위치의 객체 정보;
//		}
//		if(1번 위치에 있는 Artist 의 이름이 name과 같다면) {
//			find = 1번 위치의 객체 정보;
//		}
//		if(2번 위치에 있는 Artist 의 이름이 name과 같다면) {
//			find = 2번 위치의 객체 정보;
//		}
//		if(3번 위치에 있는 Artist 의 이름이 name과 같다면) {
//			find = 3번 위치의 객체 정보;
//		}
//		if(4번 위치에 있는 Artist 의 이름이 name과 같다면) {
//			find = 4번 위치의 객체 정보;
//		}

		// 결과
		System.out.println("존재하지 않는 이름입니다");

		System.out.println("해당 대상의 정보 출력");

	}
}

 

(4) 반복문을 통해 리스트의 데이터를 직접 탐색하여 있으면 리모컨에 정보 설정

package api.collection;

import java.util.ArrayList;
import java.util.List;

public class Test11_3 {
	public static void main(String[] args) {
		
		List<Artist> list = new ArrayList<>();

		// 추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		// 검색
		String name = "대니구";

		// 1. 비어있는 리모컨을 준비
		Artist find = null;

		// 2. 반복문을 통해 리스트의 데이터를 직접 탐색하여 있으면 리모컨에 정보 설정
		for (int i = 0; i < list.size(); i++) {
			Artist art = list.get(i);
			if (art.getName().equals(name)) {// i번 위치의 Artist 이름이 name과 같다면
				find = art;// find에 찾은 객체 정보를 전달하라
				break;// 찾으면 그만(성능 향상)
			}
		}

		// 결과
//		System.out.println("find = " + find);
		if (find == null) {
			System.out.println("찾으시는 이름은 존재하지 않습니다");
		} else {
			System.out.println(name + " 에 대한 검색 결과");
			System.out.println(find);
		}

	}
}

 

(5) 저장되어있는 아티스트들을 스캐너를 통해 "이름"으로 찾기

package api.collection;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test11_6 {
	public static void main(String[] args) {
		
		List<Artist> list = new ArrayList<>();

		// 추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.print("투표할 이름 : ");
			String name = sc.nextLine();

//			if(name == "그만") {//안됨
			if (name.equals("그만")) {
				break;
			} else {
				// 검색 및 투표
			}
		}
		sc.close();

		// 출력
		System.out.println("투표가 완료되었습니다");
		for (Artist art : list) {
			System.out.print("[");
			System.out.print(art.getName());
			System.out.print("-");
			System.out.print(art.getPosition());
			System.out.print("]");
			System.out.print(" ");
			System.out.print("득표수 : ");
			System.out.print(art.getCount());
			System.out.println();
		}

	}
}

 

(6) 이름 찾기와 투표 기능 합치기

package api.collection;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test11_7 {
	public static void main(String[] args) {
	
		List<Artist> list = new ArrayList<>();

		// 추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.print("투표할 이름 : ");
			String name = sc.nextLine();

//			if(name == "그만") {//안됨
			if (name.equals("그만")) {
				break;
			} else {
				// 검색 및 투표
				// 1. 비어있는 리모컨을 준비
				Artist find = null;

				// 2. 반복문을 통해 리스트의 데이터를 직접 탐색하여 있으면 리모컨에 정보 설정
				for (int i = 0; i < list.size(); i++) {
					Artist art = list.get(i);
					if (art.getName().equals(name)) {// i번 위치의 Artist 이름이 name과 같다면
						find = art;// find에 찾은 객체 정보를 전달하라
						break;// 찾으면 그만(성능 향상)
					}
				}

				// 3. 검색 여부에 따라 다른 메세지를 준비하고, 검색 결과가 있으면 투표처리
				if (find != null) {// 검색 결과가 있으면
					find.vote();
					System.out.println("[" + find.getName() + "] 투표가 완료되었습니다");
				} else {// 검색 결과가 없으면
					System.out.println("찾으시는 이름의 후보가 없습니다");
				}
			}
		}
		sc.close();

		// 출력
		System.out.println("투표가 완료되었습니다");
		for (Artist art : list) {
			System.out.print("[");
			System.out.print(art.getName());
			System.out.print("-");
			System.out.print(art.getPosition());
			System.out.print("]");
			System.out.print(" ");
			System.out.print("득표수 : ");
			System.out.print(art.getCount());
			System.out.println();
		}

	}
}

 

마무리 정렬 기능 추가

package api.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

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

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

		// 추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.print("투표할 이름 : ");
			String name = sc.nextLine();

//			if(name == "그만") {//안됨
			if (name.equals("그만")) {
				break;
			} else {
				// 검색 및 투표
				// 1. 비어있는 리모컨을 준비
				Artist find = null;

				// 2. 반복문을 통해 리스트의 데이터를 직접 탐색하여 있으면 리모컨에 정보 설정
				for (int i = 0; i < list.size(); i++) {
					Artist art = list.get(i);
					if (art.getName().equals(name)) {// i번 위치의 Artist 이름이 name과 같다면
						find = art;// find에 찾은 객체 정보를 전달하라
						break;// 찾으면 그만(성능 향상)
					}
				}

				// 3. 검색 여부에 따라 다른 메세지를 준비하고, 검색 결과가 있으면 투표처리
				if (find != null) {// 검색 결과가 있으면
					find.vote();
					System.out.println("[" + find.getName() + "] 투표가 완료되었습니다");
				} else {// 검색 결과가 없으면
					System.out.println("찾으시는 이름의 후보가 없습니다");
				}
			}
		}
		sc.close();

		// 투표수 순으로 정렬(투표수가 같으면 이름순 정렬)
		Comparator<Artist> c = new Comparator<Artist>() {
			@Override
			public int compare(Artist a, Artist b) {
				if (a.getCount() == b.getCount()) {// 투표수가 같으면
					return a.getName().compareTo(b.getName());// 이름 오름차순
				} else {// 투표수가 다르면
					return b.getCount() - a.getCount();// 투표수 내림차순
				}
			}
		};
		Collections.sort(list, c);

		// 출력
		System.out.println("투표가 완료되었습니다");
		for (Artist art : list) {
			System.out.print("[");
			System.out.print(art.getName());
			System.out.print("-");
			System.out.print(art.getPosition());
			System.out.print("]");
			System.out.print(" ");
			System.out.print("득표수 : ");
			System.out.print(art.getCount());
			System.out.println();
		}

	}
}

투표할 이름 : 녹두
[녹두] 투표가 완료되었습니다
투표할 이름 : 녹두
[녹두] 투표가 완료되었습니다
투표할 이름 : 대니구
[대니구] 투표가 완료되었습니다
투표할 이름 : 제이유나
[제이유나] 투표가 완료되었습니다
투표할 이름 : 그만
투표가 완료되었습니다
[녹두-보컬] 득표수 : 2
[대니구-바이올린] 득표수 : 1
[제이유나-보컬] 득표수 : 1
[박다울-거문고] 득표수 : 0
[황린-일렉기타] 득표수 : 0

 

- 추가

이름이 같으면 같은 대상이라는 비교기준을 설정

-->equals & hashCode
정렬 기준을 내장 설정
--> Comparable 상속 후 compareTo 재정의

package api.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Test11_10 {
	public static void main(String[] args) {
		
		List<Artist> list = new ArrayList<>();

		// 추가
		list.add(new Artist("녹두", "보컬"));
		list.add(new Artist("대니구", "바이올린"));
		list.add(new Artist("제이유나", "보컬"));
		list.add(new Artist("박다울", "거문고"));
		list.add(new Artist("황린", "일렉기타"));

		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.print("투표할 이름 : ");
			String name = sc.nextLine();

//			if(name == "그만") {//안됨
			if (name.equals("그만")) {
				break;
			} else {
				// 검색 및 투표
				// = hashCode와 equals 설정되어 있으므로
				// = indexOf로 위치를 찾아서 확인 가능

				// int index = list.indexOf(name);//이름으론 안됨
				Artist art = new Artist(name);
				int index = list.indexOf(art);

				if (index >= 0) {// 검색 결과가 있으면
					Artist find = list.get(index);
					find.vote();
					System.out.println("[" + find.getName() + "] 투표가 완료되었습니다");
				} else {// 검색 결과가 없으면
					System.out.println("찾으시는 이름의 후보가 없습니다");
				}
			}
		}
		sc.close();

		// 투표수 순으로 정렬(투표수가 같으면 이름순 정렬)
		Collections.sort(list);

		// 출력
		System.out.println("투표가 완료되었습니다");
		for (Artist art : list) {
			System.out.print("[");
			System.out.print(art.getName());
			System.out.print("-");
			System.out.print(art.getPosition());
			System.out.print("]");
			System.out.print(" ");
			System.out.print("득표수 : ");
			System.out.print(art.getCount());
			System.out.println();
		}

	}
}