2016-12-07 3 views
-1

이 메서드는 TV 시리즈 객체의 arraylist를 조사해야합니다. 그러나, 내 + for 루프의 j ++는 dead code 오류를 제공하고 현재 arraylist에 저장되지 않은 제목을 입력하면 무한 루프가 발생합니다. 이유는 모르겠다. SOS 편집; 이 과제를 설정 한 강사는 반복자 사용을 허용하지 않습니다.루프를위한 무한 루프와 데드 코드

public void deleteseries(Scanner sc){ 

    System.out.println("Enter the Title of the Series you want to Remove"); 
    System.out.println("Cureent Series Stored: "); 
    for (TV_Series tv:series) { 
     System.out.println(tv.getTitle()); 
    } 
    String title_to_delete = sc.nextLine().toUpperCase(); 
    boolean found = false; 
    do{ 
     for(int j = 0; j < series.size(); j++){ 
      if (series.get(j).getTitle().equalsIgnoreCase(title_to_delete)) 
       { 
        series.remove(j); 
        System.out.println("Series Removed"); 
        found=true; 
        //Jump out of loop 

        break; 
       } 
      else 
       { 
        System.out.println("No Results for Title "+title_to_delete); 
        found = false; 
        break; 
       } 
     } 
    }while(found==false); 
} 
+4

* for * 루프에서 무엇이'i ++'입니까? – RealSkeptic

+2

당신은 무조건'for' 루프 종류에서 빠져 나옵니다. 따라서 루프의 "증분"부분을 실행할 필요가 없습니다. –

+0

하나의 레코드 만 검색하는 경우 왜 중첩 루프가 있습니까? – Coder

답변

1

여기에는 몇 가지 관련 문제가 있습니다. 루프 구조가 어떻게 작동하는지 검토해야한다고 생각합니다.

배열을 반복해야하는 for 루프를 코딩했습니다. 괜찮아. 그러나 iterate를 반복하는 대신 첫 번째 반복에서 루프를 중단하도록 설정했습니다. 루프가 반복되지 않는다는 것을 알아 차렸으므로 반복문의 첫 번째 반복을 반복해서 반복 실행하므로 루프를 do-while 루프로 묶었다고 가정합니다. 또한 do-while 루프의 종료 조건은 found이되어 true으로 바뀌므로 일치 항목을 찾을 수없는 경우 루프가 종료되지 않습니다.

일반적으로 forwhile에 넣을 필요가 없습니다. for은 모두 루프 구조입니다. 당신의 for이 그 자체로 반복하지 않는 유일한 이유는 당신이 break 문장을 넣었다는 것입니다; 반복을 중단하려면 break을 사용하여 for 루프를 종료해야합니다. 따라서 블록의 if 블록에는 의미가있을 수 있지만 확실히 else 블록은 아닙니다.

마지막으로, else 블록은 모든 반복에 대해 실행됩니다 (다른 문제가 해결되면). 모든 반복에서 "일치하는 항목을 찾을 수 없음"이라고 말하는 것은 의미가 없습니다. if 블록 을 넣고 루프를 for 루프로 설정하면 반복하지 않고 모든 반복을 반복 할 수 있습니다 (즉, found이 여전히 false 인 경우).

+0

do-while 루프와 else 문을 제거하고 for 루프 외부에 if를 배치 하시겠습니까? – qubcoder

1

ifelse 부분은 모두 for 루프 외부에서 break입니다. 또한

, 당신이 찾아 제거 아래 사항 사용하려면 : 목록 반복하면서 수정 될 것입니다 있기 때문에

, 나는 반복자를 사용했다.

public void deleteseries(Scanner sc){ 

    System.out.println("Enter the Title of the Series you want to Remove"); 
    System.out.println("Cureent Series Stored: "); 
    for (TV_Series tv:series) { 
     System.out.println(tv.getTitle()); 
    } 
    String title_to_delete = sc.nextLine().toUpperCase(); 
    boolean found = false; 
    //do{ 
     for(Iterator<TV_Series> itr = series.iterator(); itr.hasNext();){ 
      TV_Series tvs = itr.next(); 
      if (tvs.getTitle().equalsIgnoreCase(title_to_delete)) 
       { 
        itr.remove(); 
        System.out.println("Series Removed"); 
        found=true; 
        //Jump out of loop 

        break; 
       } 
       //else 
       //{ 
       // System.out.println("No Results for Title "+title_to_delete); 
       // found = false; 
       // break; 
       //} 
     } 
// }while(found==false); 
} 
1

반복 가능한 모음을 수정하는 경우 "ConcurrentModificationException"을 방지하기 위해 반복자를 사용하는 것이 좋습니다. 또한 do-while 부분을 i ++ 문제를 해결하고 더 깨끗한 코드로 수정하는 것과 같은 중복 코드를 삭제했습니다. 내 제안을 확인하십시오 :

public void deleteseries(Scanner sc){ 

    System.out.println("Enter the Title of the Series you want to Remove"); 
    System.out.println("Cureent Series Stored: "); 
    for (TV_Series tv:series) { 
     System.out.println(tv.getTitle()); 
    } 
    String title_to_delete = sc.nextLine().toUpperCase(); 
    Iterator<TV_Series> it = series.iterator(); 
    while (it.hasNext()){ 
     TV_Series tmpSeries = it.next(); 
     if (tmpSeries.getTitle().equalsIgnoreCase(title_to_delete)) { 
      it.remove(); 
      System.out.println("Series Removed"); 
      break; 
     } 
    } 
}