你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
在所有迭代。您可以使用此代碼替換代碼,因爲它使用ArrayList
本身的方法來完成任務,將沒有任何for
循環工作:
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