从ArrayList问题中删除项目

时间:2012-05-12 01:49:31

标签: java arraylist

我正在编写一个具有从其他类中删除对象的方法的类。但它只是正常工作,输出不正确。请帮助我,有没有更好的解决方案,我认为我的解决方案非常麻烦。这是我的代码:

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类的列表,其中包含截止日期属性。我想通过比较日记类中的任务和评估类中的截止日期属性来创建一个返回新列表的方法,该列表具有过期任务列表。程序编译成功但结果不正确如果我想测试列表返回没有任务项,因为没有任务结束。

3 个答案:

答案 0 :(得分:3)

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

您说您希望您的方法根据某些条件返回包含来自taskCollection的元素的 new 列表。与此同时,我认为你不想以任何方式破坏或改变taskCollection。

因此,不要将temp创建为taskCollection的引用,而应将其改为new ArrayList<Task>()。然后将任务添加到您希望最终从方法返回的temp(新列表)。

我将离开我的adivce,因为你的代码样本,孤立地,有许多未知数,禁止我对你真正需要它做什么进行任何有根据的猜测。

此外,循环太多了! (我主要是在开玩笑,但是认真......)


通过以下评论中的更多信息,我修改了您的代码以实现我的建议。为了将项目添加到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;
}

答案 1 :(得分:1)

如果您需要在迭代时更改列表,请使用ListIterator。在列表中调用listIterator()创建一个,然后在ListIterator上查看相关方法。

答案 2 :(得分: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:不管在条件或循环条件下的语句数量如何,总是更好地练习使用花括号。