본문 바로가기

소프트웨어/Android/Java/Ndk

JAVA] Iterator와 ArrayList를 이용한 기본적인 도서목록 검색

 

package iterator_learn;

import java.util.*;

public class itr_src {
 

 public void getBook(ArrayList lst){
  Iterator<String> itr = lst.iterator();
  //getBook함수가 불려오면 itr이라는 새로운 iteratior 생성

  Scanner scan = new Scanner(System.in);

  System.out.println("검색하실 책 이름을 입력하시오");
  String bookname=scan.nextLine();

  int src_rst=0;
  int count=1;
  while(itr.hasNext()){
   if ( itr.hasNext()==true && bookname.equals(itr.next())){
    System.out.println(bookname +"가 리스트 내 존재");
    System.out.println("도서 위치: "+itr.next());
    //해당열의 다음 저장값 출력
    //즉 그놈의 위치가 됨
    src_rst=1;//검색값이 있는지 없는지 알려주는 변수
   }else if (lst.size()==count && src_rst==0){

    System.out.println("has not found");
   }
   count++;
  }
 }
 
 public void getList(ArrayList lst){
  Iterator<String> itr = lst.iterator();

  int enter_cnt=1;
  while(itr.hasNext()){
   if(enter_cnt%2==1){
    System.out.print(itr.next() +" : ");
    enter_cnt++; // 다음 enter_cnt를 짝수로 만듦
   }
   if(enter_cnt%2==0){
    System.out.println(itr.next() );
    enter_cnt--; //다음 enter_cnt를 1로 만듬
   }
  
  }
 }
 
 public void setBook(ArrayList lst){
  Scanner scan= new Scanner(System.in);
  System.out.println("등록하실 책 이름을 입력하시오");
  String book=scan.nextLine();
  System.out.println("책의 위치를 입력 해주세요(ex:1층 1열)");
  String line=scan.nextLine();
  
  lst.add(book);
  lst.add(line);
  
 }
 
}
 

 

package iterator_learn;

import java.util.*;

public class lib_main {

 public static void main(String[] args) {

  ArrayList<String> ar = new ArrayList<String>();
  
  itr_src gyl = new itr_src();
  
  Scanner scan = new Scanner(System.in);
  while(true){
   System.out.println("매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기");
   int menu_select=scan.nextInt();
   if (menu_select ==1){
    gyl.setBook(ar);
   }else if (menu_select ==2){
    gyl.getBook(ar);
   }else if (menu_select ==3){
    gyl.getList(ar);
   }else if (menu_select ==4){
    System.out.println("감사합니다");
    break;
   }else{
    System.out.println("잘못 입력하셨습니다. 다시 입력해주세요.\n");
   }
   System.out.println("\n\n");
  }
  
  
 }

}
 

 

 

1. 처음에는 배열을 이용해서 책 등록을 하였다. c에서와 같이 a[]의 배열을 이용 하였었다. 소스를 짜다 보니, main에 소스가 한바닥 ㅋㅋ... 그래서 이게 C와 다른점이 무엇인가..라는 생각에 여러 방법을 생각.

 

2. 그래서 찾아본것이 HashMap,ArrayList,Map.

 

3. HashMap<String,String>을 이용해서 프로그램을 짰으나... 아직 내가 이해하기엔 너무 어려웠다...

 

4. 그래서 ArrayList를 이용하여 코딩시도.

 

5. 저장된 책들의 모든 리스트를 가져오는 방법은 이런 방법을 사용하였다. 

  ArrayList를 생성-> Itr_src라는 클래스에서 객체 생성

  -> Iterator의 hasNext()를 이용해 배열내 다음값의 존재여부탐색(hasNext는 배열내 next값이 있으면 true, 없으면 false를 리턴한다)

  -> Next()를 이용해 해당 배열 값을 받아온다(Next()는 다음 배열 값을 가져온다)

  -> 배열의 끝까지 while-> hasNext가 false를 리턴하면 while 종료.

 

  주의할점은 홀수행은 책, 짝수행은 주소이기때문에 그 값들을 구분 시켜 줘야 한다.

그래서 enter_cnt라는 변수를 이용해서 이 값이 계속 1과 2로만 존재되게 만들었다.

(홀수행 실행후에는 ++, 짝수행 실행 후에는 --를 해줘서 가능하게 만들었다)

 

public void getList(ArrayList lst){
  Iterator<String> itr = lst.iterator();

  int enter_cnt=1;
  while(itr.hasNext()){
   if(enter_cnt%2==1){
    System.out.print(itr.next() +" : ");
    enter_cnt++; // 다음 enter_cnt를 짝수로 만듦
   }
   if(enter_cnt%2==0){
    System.out.println(itr.next() );
    enter_cnt--; //다음 enter_cnt를 1로 만듬
   }
  
  }
 }
 
 

 

 

 

 

 

5. 배열내 책 등록시에는 이런 방식으로 저장을 하였다.

setBook();

 "책1이름" //( lst.add("책이름"))

 "책1주소" //( lst.add("책주소"))

 "책2이름" //위와동일

 "책2주소" //위와동일

 ....

이렇게 홀수열에는 책 이름을, 짝수열에는 책 주소를 입력하였다.

왜 이렇게 썼는지는 다음 6번에서 설명

 

public void setBook(ArrayList lst){
  Scanner scan= new Scanner(System.in);
  System.out.println("등록하실 책 이름을 입력하시오");
  String book=scan.nextLine();
  System.out.println("책의 위치를 입력 해주세요(ex:1층 1열)");
  String line=scan.nextLine();
  
  lst.add(book);
  lst.add(line);
  
 } 

 

 

 

6. ArrayList는 함수의 이름대로 Array다. 이놈이 Matrix라면 참 좋을테지만 이놈은 한 열밖에 존재하지 않는다.

그래서 책 정보 따로, 주소 정보를 따로 저장 하기 위해서 홀/짝 행을 나눈 것이다.

 

7. 한가지의 책 검색은 이런 방식을 사용하여싿.

 일단, 책의 제목을 얻어야 한다. 그리고 리턴되는 값은 책의 존재여부 및 책의 주소이다.

 이 부분에서는 앞서 공부한 Scanner scan을 이용하였다.

 scan으로책의 값을 받은 후 while(hasNext)를 돌린다.

 이때 if ( itr.hasNext()==true && bookname.equals(itr.next())) 문장에 걸리면 검색이 된 것이다.

 배열내의 무언가 값이 있고, 입력받은 bookname과 검색된 배열값이 동일하면 제목과 주소를 출력해준다.

 주소는 책의 다음 행에 위치하기 때문에, 출력값에 한번 더 itr.next()를 해준다.

 즉 제목: 홀수행 ,주소 : 짝수행 이 한꺼번에 출력 되는 것이다.

 책이 검색되면 src_rst라는 변수가 1로 set된다. 이는 전체 검색 후 '검색실패'와 '검색 성공'을 구분 짓기 위한 변수이다.

 

 public void getBook(ArrayList lst){
  Iterator<String> itr = lst.iterator();
  //getBook함수가 불려오면 itr이라는 새로운 iteratior 생성

  Scanner scan = new Scanner(System.in);

  System.out.println("검색하실 책 이름을 입력하시오");
  String bookname=scan.nextLine();

  int src_rst=0;
  int count=1;
  while(itr.hasNext()){
   if ( itr.hasNext()==true && bookname.equals(itr.next())){
    System.out.println(bookname +"가 리스트 내 존재");
    System.out.println("도서 위치: "+itr.next());
    //해당열의 다음 저장값 출력
    //즉 그놈의 위치가 됨
    src_rst=1;//검색값이 있는지 없는지 알려주는 변수
   }else if (lst.size()==count && src_rst==0){

    System.out.println("has not found");
   }
   count++;
  }
 }
 

 

 

 

다음번에는 MATLAB처럼 자유롭게 MATRIX를 조작 하는 함수가 있는지 공부 해 보아야 겠다.

(혹시 아시는 분 계시면 정보좀 주세요 ㅠㅠ)

 

 

 

작동 모습

 

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
1
등록하실 책 이름을 입력하시오
world war 1
책의 위치를 입력 해주세요(ex:1층 1열)
1f 1box

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
1
등록하실 책 이름을 입력하시오
world war 2
책의 위치를 입력 해주세요(ex:1층 1열)
1f 1box

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
1
등록하실 책 이름을 입력하시오
food of korea
책의 위치를 입력 해주세요(ex:1층 1열)
2f 1box

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
1
등록하실 책 이름을 입력하시오
history of korea
책의 위치를 입력 해주세요(ex:1층 1열)
3f 1box

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
5
잘못 입력하셨습니다. 다시 입력해주세요.

 


매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
2
검색하실 책 이름을 입력하시오
history of korea
history of korea가 리스트 내 존재
도서 위치: 3f 1box

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
2
검색하실 책 이름을 입력하시오
maintain mind
has not found

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
3
world war 1 : 1f 1box
world war 2 : 1f 1box
food of korea : 2f 1box
history of korea : 3f 1box

 

매뉴 : 1.책등록 2.책검색 3.전체책목록 4.나가기
4
감사합니다