0

他のクラスからオブジェクトを削除するメソッドを持つクラスを書いています。しかし、それは正しく機能しなかっただけで、出力は正しくありません。私を助けてください、そしてこれに対するより良い解決策はありますか、私の解決策はかなり面倒だと思います。これが私のコードです:

public List<Task> getTaskDue(){        
    List<Task> temp = this.taskCollection;
    for (int unit = 0; unit < this.unitCollection.size(); unit++){            
        for (int j = 0; j < this.unitCollection.get(unit).getAssessmentCollection().size(); j++){
            for (int i = 0; i < temp.size(); i++){
                if (temp.get(i).getDueDate().compareTo(this.unitCollection.get(unit).getAssessmentCollection().get(j).getDueDate()) > 0)
                    temp.remove(i);
            }
        }  
    }
    return temp;
}

更新:期日属性を保持するタスククラスと評価クラスのリストを持つ日記クラスがあります。日記クラスのタスクと評価クラスの期日属性を比較して、期日超過タスクのリストを持つ新しいリストを返すメソッドを作成したいと思います。プログラムは正常にコンパイルされますが、リストをテストしたい場合、期限が過ぎているタスクがないため、タスク項目が返されません。

4

3 に答える 3

3

リストから要素を「削除」することは、最終的な問題ではないようです。

メソッドが、いくつかの基準に基づいて taskCollection の要素を含む新しいリストを返すようにしたいとおっしゃいました。同時に、どのような方法でも taskCollection を破棄したり変更したりしたくないと思います。

したがって、temp を taskCollection への参照として作成する代わりに、それを aにしnew ArrayList<Task>()ます。次に、メソッドから最終的に返したいタスクを temp (新しいリスト) に追加します。

あなたのコードサンプルは、単独で、あなたが本当に何をする必要があるかについて、私が知識に基づいた推測をすることを妨げる多くの未知のものを持っているので、私はそれで私のアドバイスを残すつもりです.

また、for ループが多すぎます。(ほとんど冗談ですが、まじで…)


以下のコメントからの詳細情報を使用して、私が提案していることを実装するためにコードを変更しました。アイテムを(削除するのではなく)temp に追加するには、if ステートメントを から に変更する必要があり> 0ました<= 0。また、最も内側のループで taskCollection を反復処理する代わりに、現在の評価からタスクを取得し、それらを反復処理する必要があります。

public List<Task> getTaskDue(){     
    List<Task> temp = new ArrayList<Task>();

    for(int u = 0; u < unitCollection.size(); u++){
        Unit unit = unitCollection.get(u);

        for (int a = 0; a < unit.getAssessmentCollection().size(); a++){
            AssessmentItem assessment = unit.getAssessmentCollection().get(a);

            for (int t = 0; t < assessment.getTasks().size(); t++){
                Task task = assessment.getTasks().get(t);

                if (task.getDueDate().compareTo(assessment.getDueDate()) <= 0){ 
                    temp.add(task);
                }   
            }   
        }   
    }   
    return temp;
}
于 2012-05-12T02:10:34.723 に答える
1

リストを反復処理するときにリストを変更する必要がある場合は、ListIteratorを使用してください。リストでlistIterator()を呼び出して作成し、ListIteratorで関連するメソッドを確認します。

于 2012-05-12T01:52:06.077 に答える
0

インデックスからオブジェクトを削除していますが、繰り返しのインデックスは変更されていません。リスト内の要素をスキップする理由によります。おそらくそれが、結果が正しくない理由です。

変化する:

if  ( temp.get( i ).getDueDate().compareTo( this.unitCollection.get( unit )
      .getAssessmentCollection().get( j ).getDueDate() ) > 0 )
    temp.remove(i);

に:

if  ( temp.get( i ).getDueDate().compareTo( this.unitCollection.get( unit )
      .getAssessmentCollection().get( j ).getDueDate() ) > 0 )
{  
    temp.remove(i);  
    i--;  
}

PS: 条件またはループの下でのステートメントの数に関係なく、常に花のブレースを使用することを練習することをお勧めします。

于 2012-05-12T02:02:23.507 に答える