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

更新:我有 Diary 类,其中包含具有截止日期属性的 Task 类和 Assessment 类的列表。我想创建一个方法,通过将日记类中的任务与评估类中的到期日期属性进行比较,返回一个包含过期任务列表的新列表。程序编译成功,但如果我想测试列表,结果不正确,因为没有任务过期,所以不返回任务项。

4

3 回答 3

3

似乎从列表中“删除”元素不是您的最终问题。

您说您希望您的方法返回一个列表,其中包含基于某些条件的 taskCollection 中的元素。同时,我认为您不想以任何方式破坏或更改 taskCollection。

因此,与其创建 temp 作为对 taskCollection 的引用,不如让它成为 a new ArrayList<Task>()。然后将任务添加到您希望最终从您的方法返回的临时(新列表)。

我将在此留下我的建议,因为您的代码示例,孤立地,有很多未知数,使我无法对您真正需要它做什么做出任何有根据的猜测。

另外,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 回答