2016-12-07 3 views
-1

Этот метод должен просматривать арраист объектов телесериала. Тем не менее, j ++ в цикле my for дает ошибку с мертвым кодом, а ввод заголовка, который в настоящее время не сохраняется в 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

* Что * 'i ++' в цикле for? – RealSkeptic

+2

Вы * do * безоговорочно выходите из цикла 'for'. Таким образом, часть «increment» цикла никогда не должна запускаться. –

+0

Почему у вас есть вложенные петли, если вы только просматриваете одну запись? – Coder

ответ

1

Здесь есть несколько связанных вопросов; Я думаю, вам, возможно, потребуется просмотреть, как работают петлевые структуры сверху.

Вы закодировали цикл for, который должен перебирать массив; хорошо. Но вместо того, чтобы разрешить его повторять, вы настроили его на разрыв от цикла во время 1-й итерации. Я предполагаю, что вы заключили его в цикл do-while, потому что вы заметили, что он не выполняет итерацию, но это снова повторяет первую итерацию цикла снова и снова. Кроме того, условие выхода цикла do-while будет found, поворачивая true, поэтому цикл не выходит, если совпадение не найдено.

Как правило, вам не нужно прилагать for в while, чтобы получить итерацию; for - это структура цикла сама по себе. Единственная причина, по которой ваш for не будет перебирать самостоятельно, заключается в том, что вы ввели break операторов; использование break для выхода из цикла for необходимо, только если вы хотите прервать итерацию. Поэтому может быть смысл break в блоке if, но, конечно, не блок else.

Наконец, блок else, как указано, будет запускаться для каждой итерации (после устранения других проблем); на каждой итерации не имеет смысла говорить «нет совпадения». Вы можете поставить if блок после цикл for, чтобы напечатать ошибку, если цикл прошел через все итерации без нахождения соответствия (т. Е. Если found по-прежнему является ложным).

+0

Итак, удалите цикл do-while и инструкцию else и поместите if вне цикла for? – qubcoder

1

Все ваши if и else часть break Выполнение внутренней петли for.

Кроме того, если вы хотите, чтобы найти и удалить, используйте ниже:

Кроме того, я использовал итератор, потому что список будет изменен во время цикла.

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

Когда Iterable Коллекции необходимости модифицировать я настоятельно рекомендую использовать итераторы для предотвращения «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; 
     } 
    } 
}    
Смежные вопросы