2016-12-23 7 views
-5

У меня есть ArrayList, который содержит экземпляры класса Staff. Когда я пишу следующий код, который я сообщил IntelliJ, что «for утверждение не петля»:Почему это для цикла над ArrayList генерирует предупреждение о том, что «оператор for не работает» в IntelliJ

public String getTypist() { 
    String tempTy = ""; 
    for (Staff g : staffList) { 
     if (g.getStaffID().contains("TY") && g.isAvailable()){ 
      tempTy = g.getStaffID(); 
     } 
     staffList.remove(g); 
     staffWorking.add(g); 
     break; 
    } 

    return tempTy; 
} 

Я действительно путают, как я думал, что это был способ правильно использовать for петлю на условиях ArrayList , Что я делаю неправильно с моей петлей for?

+4

Вы называете 'перерыв,' во время первой итерации, поэтому цикл никогда не будет перебирать. Кроме того, вы не можете изменять 'ArrayList', пока вы его итерации. – nickb

+1

Почему вы положили перерыв, если хотите перебрать список? –

+0

Просто удалите оператор break. – Mordechai

ответ

1

Вашего for цикл содержит break заявления, которое всегда выполняет независимо от того, что происходит раньше в цикле, поэтому после того, как происходит сам первое сквозными, то break происходит, и ничего не зацикливается после этого. Это в основном делает его таким, как если бы не было цикла for вообще, поскольку выполнение кода один раз по умолчанию является способом выполнения ряда операторов. Исправление это связано с тем, что break выполняет только некоторые из циклов (в частности, убедитесь, что он выполняется только в цикле, который вы хотите быть последним циклом). Изготовление, что коррекция с добавлением некоторых других исправлений вы получите код, подобный этому:

public String getTypist() { 
    for (Staff s : staffList) { 
     if (s.getStaffID().contains("TY") && s.isAvailable()){ 
      staffList.remove(s); 
      staffWorking.add(s); 
      return s.getStaffID(); 
     } 
    } 

    return ""; 
} 

Однако, есть альтернативное решение, которое позволило бы вам избежать итераций над ArrayList на всех. Вы можете заменить этот код с помощью этого кода, и он будет работать без какого-либо for цикла, поскольку она использует методы самого ArrayList для выполнения этой задачи:

public String getTypist() { 
    ArrayList<Staff> staffWorking = new ArrayList<>(staffList);   
    staffWorking.removeIf(staff -> !(staff.isAvailable() && staff.getStaffID().contains("TY"))); 

    staffList.removeAll(staffWorking); 

    Optional<Staff> typist = staffWorking.stream().findFirst(); 
    if(typist.isPresent()){ 
     return typist.getStaffID(); 
    }else{ 
     return ""; 
    } 
} 

Хотя даже это может быть упрощено и улучшено до этого (это кода поддерживает одновременную фильтрацию, на многопроцессорных системах это будет намного быстрее):

private static final Predicate<Staff> isATypistWorker = 
    staff -> staff.isAvailable() && staff.getStaffID().contains("TY"); 

public String getTypist() { 
    ArrayList<Staff> typistWorkers = staffList.stream() 
     .parallel() 
     .filter(isATypistWorker) 
     .distinct() 
     .collect(Collectors.toCollection(ArrayList::new)); 

    staffList.removeAll(typistWorkers); 
    staffWorkers.addAll(typistWorkers); 

    Optional<Staff> typist = typistWorkers.stream().findFirst(); 

    return typist.isPresent() ? typist.getStaffID() : ""; 
} 
0

Вы не зацикливаете, потому что вы всегда break после первой итерации цикла. Я думаю, вам нужны скобки вокруг вашего заявления if.

public String getTypist() { 
    String tempTy = ""; 

    for (Staff g : staffList) { 
     if (g.getStaffID().contains("TY") && g.isAvailable()) { 
      tempTy = g.getStaffID(); 
      staffList.remove(g); 
      staffWorking.add(g); 
      break; 
     } 
    } 

    return tempTy; 
} 

Кроме того, код, который я не будет работать, потому что вы не можете удалить из ArrayList в то время как перекручивание через него. Но это другая проблема.

+0

Я использовал перерыв, когда я пытался найти первый экземпляр, который соответствовал критериям, а затем остановился ... Я думаю, что цикл for не является правильным утверждением? – Patrick

+0

Разница между кодом, который я опубликовал, и кодом, который вы опубликовали, есть скобки после моего оператора if if, чтобы содержать остальную часть логики в цикле. Если вы не понимаете разницу, прочитайте [this] (http://stackoverflow.com/a/15786982/2464657). Также цикл 'for' не будет работать для вас, потому что вы не можете удалить из' ArrayList', итерации по нему. Если вы этого не понимаете, прочитайте [this] (http://stackoverflow.com/questions/10431981/remove-elements-from-collection-while-iterating). – Adam

 Смежные вопросы

  • Нет связанных вопросов^_^