【问题标题】:Java LinkedList issues - how to remove items that meet certain qualificationsJava LinkedList 问题 - 如何删除符合某些条件的项目
【发布时间】:2011-12-12 03:16:07
【问题描述】:

我有一个问题,

这是我需要做的-

我有与数字相关联的BankItems。我填写了列表,但是当输入的对象比列表中当前的最低美元价值多 100 美元时,我想删除价值较低的对象。

首先 - 我创建列表

    List<BankItem> listOfBankItems = new LinkedList<BankItem>();

稍后在程序中我创建一个新的 BankItem 对象并将其添加到列表中

listOfBankItems.add(createdItem);

添加每个项目后,我想检查新项目是否比列表中已有的任何对象多 100 美元,所以我运行类似这样的操作

   for (int i = 0; i < listOfBankItems.size(); i++) {
    int oldValue =listOfBankItems.get(i).getAmount();
    int  newValue = createdItem.getAmount();
    int calculatedDif = newValue - oldValue;


    if (calculatedDif > 100) {
       listOfBankItems.remove(i); 
    }
}

很遗憾,这不起作用。我不知道这是怎么回事。也许我不应该使用LinkedList?也许我的逻辑有点离谱。请帮忙。

谢谢!!!

【问题讨论】:

  • 你可以使用一些排序的数据结构,比如TreeMap,或者实现Heap或者使用Priority Queue。
  • 排序不是实现您想要的,但@Bhushan 是对的 - 如果您使用早期休息,这将使算法更快。

标签: java object linked-list


【解决方案1】:

问题是删除后的所有项目的索引都会在你删除该元素后发生变化;因此,您基本上会在删除一个元素后跳过下一个元素。

使用迭代器:

for (Iterator<BankItem> itr = listOfBankItems.iterator(); itr.hasNext();) {
    BankItem item = itr.next();
    int oldValue = item.getAmount();
    int newValue = createdItem.getAmount();
    int calculatedDif = newValue - oldValue;
    if (calculatedDif > 100) {
       itr.remove(); 
    }
}

【讨论】:

    【解决方案2】:

    您最重要的问题可能与并发修改有关。例如,如果元素 #49 是要删除的元素,一旦删除它,下一个元素现在将是 #49,但您将检查 #50(因为 i 仍然递增) - 所以你您的支票中可能缺少元素。

    有几种方法可以处理这个问题。您可以从 for 循环中删除 i++(只留下尾随分号),然后执行以下操作:

    if (calculatedDif > 100) {
       listOfBankItems.remove(i); 
    } else {
       i++;
    }
    

    或者,您可以使用Iterator 及其remove() 方法,它会自动为您处理此问题。

    您还可以通过不获取newValue 并在循环的每一步重新计算calculatedDif 来提高性能。在for 循环上方声明这两行。

    【讨论】:

    • +1 对欧内斯特的回答,他为此提供了一个具体的例子,说明我提到的替代方案 - 我会推荐。 (感谢他为你做功课!:-)
    • 我认为您的答案实际上更好:您有两种修复方法,以及性能改进的提示(这也是一种风格,如果这些意图是什么更清楚)循环上方有两行。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多