근손실전문가
10
2021-09-16 16:00:34 작성 2021-09-16 16:14:14 수정됨
3
152

자바어린이 배열 중복체크 관련질문


안녕하십니까 ! 최근 자바에 흥미를 느끼고 독학으로 조금씩 이것저것 해보고있는 코린이입니다 !!

이번에는 주소록을 한번 만들어보려고 하는데 중복체크, 정보수정에서 아무리 생각하고 접근해봐도 

어떻게 접근해야하는지 이틀째 구글링을 해봐도 제가 시도하는 방식의 답은 없어서

이렇게 염치불구하고 질문드립니다ㅜㅜ


중복체크를 하는 부분을 어떻게 풀어내야 다음 성별,나이로 넘어가게 할 수있는지 잘 모르겠습니다 ㅜㅜ 


public class addressMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		ArrayList<Address> phoneBook = new ArrayList<Address>();
		
		while(true) { 
			// 메인
			System.out.println("주소록 시스템에 오신것을 환영합니다.\n ==============================");
			System.out.print("무엇을 하시겠습니까? : [1]추가 [2]수정 [3]삭제 [4]검색 [5]주소록조회 [6]종료 >> ");
			//메인 끝
			
			//메뉴 선택
			int menunum = sc.nextInt();
			switch(menunum) {
			case 1 : // [1] 추가
				System.out.print("이름 : ");
				String name = sc.next(); // 새로운 이름을 저장
				for(Address i : phoneBook) {
					if(i.name == name) {
						System.out.println("이미 존재하는 이름입니다.");
					} else {
						System.out.print("성별 : ");
						String gender = sc.next();
						System.out.print("나이 : ");
						int age = sc.nextInt(); // 새로운 나이를 저장
						System.out.print("전화번호 : ");
						String phone = sc.next(); // 새로운 전화번호를 저장
						phoneBook.add(new Address(name, gender, age, phone));
						System.out.println("\n 주소록에 정상적으로 추가되었습니다.");
						System.out.println();
					}
			}
				break;


수정하는 부분은 배열에서 번호를 선택하면 해당하는 사람의 정보를 수정하게 하고싶은데 아무래도 산으로 가고있는것 같습니다 .. ㅜㅡㅜ  

case 2 : // [2] 수정
				System.out.println("==============================");
				System.out.println();
				
				if(phoneBook.size() <= 0) {
					System.out.println("등록된 연락처가 없습니다.");
			} else {
					for(int i = 0; i < phoneBook.size(); i++) {
						System.out.println((i + 1) + ". " + phoneBook.get(i).toString());
						System.out.println();
					}
					System.out.println("==============================");
					System.out.print("수정하실 연락처를 선택해주세요. >> ");
					int select = sc.nextInt();
					if(select > phoneBook.size()) {
						System.out.println("잘못된 번호입니다.");
					} else {
						System.out.println("새로운 이름을 입력해주세요.");
						System.out.print("이름 : ");
						String newnm = sc.next();
						System.out.print("성별 : ");
						String newgen = sc.next();
						System.out.print("나이 : ");
						int newage = sc.nextInt();
						System.out.print("전화번호 : ");
						String newph = sc.next();
						
						phoneBook.add(new Address(newnm, newgen, newage, newph));
						
						System.out.println(newnm + "님의 정보를 새로 수정하였습니다.");
						System.out.println();
					}
				}
				break;


염치불구하고 허접한 질문 올려서 죄송합니다 ! 

0
  • 답변 3

  • 유니파
    494
    2021-09-16 16:29:50 작성 2021-09-16 16:30:23 수정됨

    중복체크를 하는 부분은 저렇게 하면 주소록에 존재하는 주소만큼 계속 입력을 받으려고 시도합니다.

    반복문 안에 이름중복 검증과 정보 입력부분을 같이 넣지 마시고 분리시키세요.

    while문을 써서 이름을 계속 입력받으면서 배열의 길이만큼 for문으로 체크하고,

    같은 이름이 없을경우 반복문(while)을 탈출하고 나머지 정보를 입력받게 하세요.

  • 비둘기야밥먹장
    239
    2021-09-16 16:45:59 작성 2021-09-16 16:47:35 수정됨

    일단 입력하는 기능에서 중복체크 로직도 제대로 동작하지 않을거같습니다.
    만약 제가 짠다면 대충 아래와같이 로직을 구성할거같아요.
    코드 대충 쓱 보고 짰으니 한번 고민해보세요~


    case 1:
      boolean nameExists = phoneBook.stream().anyMatch(address -> address.getName().equals(name));
      if(nameExists) throw new RuntimeException("이미 존재하는 이름입니다.");
      var address = new Address(xx, xx, xx);
      phonBook.add(address);
      printNewAddress(address);
      break;
    
    case 2:
      var address = phoneBook.stream().findAny(address -> address.getName().equals(name)).orElseThrow(()-> new RuntimeException("연락처를 찾을 수 없습니다."));
      .
      .
      .
      address.changeName(name);
      address.changeGender(gender);
      address.changeAge(age);
      address.changePhoneNumber(phoneNumber);
      .
      .
      .
      printChanges(address);
      break;


  • 근손실전문가
    10
    2021-09-16 17:20:36

    @비둘기야밥먹장


    저에게는 아직 조금 어려운 부분의 문장들인것같습니다 ! 

    조금만 더 쉽게 풀어주실수는 없을까요? for 문이나, if , while 까지밖에 아직 독학하지 못해서요..

    제가 아는 선에서 풀어보고싶습니다 !! ㅜㅜ 


  • 로그인을 하시면 답변을 등록할 수 있습니다.