ループには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
を反復処理を回避できるようになる他の解決策があります。 (これをしてもそれが簡素化され、これに改善することができたものの
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 "";
}
}
:あなたはこのコードでそのコードを置き換えることができ、それがタスクを達成するためにArrayList
自身のメソッドを使用しているため、それがどのfor
ループせずに動作しますそれはをはるかに高速になり、マルチプロセッサシステム上のように、コードは)同時フィルタリングをサポートしています。あなたが呼び出す `破る
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