Вашего 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() : "";
}
Вы называете 'перерыв,' во время первой итерации, поэтому цикл никогда не будет перебирать. Кроме того, вы не можете изменять 'ArrayList', пока вы его итерации. – nickb
Почему вы положили перерыв, если хотите перебрать список? –
Просто удалите оператор break. – Mordechai