2016-12-23 10 views
-5

ArrayListにはStaffクラスのインスタンスが含まれています。私はこれを正しくArrayListforループを使用する方法だと思ったようなぜArrayList上のforループは、IntelliJで "for文がループしない"という警告を生成します

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文がループしない」というのIntelliJで聞いています。私のforループで間違って何をしていますか?

+4

;'最初の反復中、ループが反復することはありませんので。また、反復処理中に 'ArrayList'を変更することはできません。 – nickb

+1

なぜリストをループしたいのですか? –

+0

break文を削除するだけです。 – Mordechai

答えて

1

ループには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() : ""; 
} 
0

ループの最初の反復の後で常にbreakであるため、ループしていません。私はあなたのifステートメントの周りに括弧が必要だと思います。それをループしながら、あなたはArrayListから削除することはできませんので

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; 
} 

また、私は投稿のコードは動作しません。しかしそれは別の問題です。

+0

基準を満たした最初のインスタンスを見つけようとしていたので、ブレークを使用しました...私はforループが正しいステートメントではないと思いますか? – Patrick

+0

投稿したコードと投稿したコードの違いは、ループの残りのロジックを含むために私の 'if'ステートメントの後に角括弧があることです。違いを理解できない場合は、[this](http://stackoverflow.com/a/15786982/2464657)を読んでください。また 'for'ループはあなたのために働きません。なぜなら、' ArrayList'から反復する間にそれを取り除くことができないからです。あなたがそれを理解していないなら、[this](http://stackoverflow.com/questions/10431981/remove-elements-from-collection-while-iterating)を読んでください。 – Adam

関連する問題