【问题标题】:Shorter way to compare two lists and remove values that are in both?比较两个列表并删除两者中的值的更短的方法?
【发布时间】:2014-03-17 03:29:12
【问题描述】:

我正在尝试比较两个 ArrayList,如果它们出现在第二个列表中,则从列表中删除它们。两个列表都包含相同的类:“EditableListItem.

ArrayList<EditableListItem> items = new ArrayList<EditableListItem>();
ArrayList<EditableListItem> addedItems = new ArrayList<EditableListItem>();

我已经编写了这段代码,它可以完成这项工作,但我觉得这不是一个很好的解决方案。

    int remove_n = -1;
    for(int k=0;k<addedItems.size();k++)
    {
        for(int i=0;i<items.size();i++)
        {
            if(items.get(i).getKey().equals(addedItems.get(k).getKey()))
            {
                remove_n = i;
            }
        }
        if(remove_n > -1)
        {
            items.remove(remove_n);
            remove_n = -1;
        }
    }

有没有办法用更少的行来做到这一点?或者也许使用 ArrayList 中的一些方法?

谢谢

【问题讨论】:

  • 查看ArrayList的javadoc。

标签: java arraylist


【解决方案1】:

您可以使用ArrayList#removeAll(Collection c),例如items.removeAll(addedItems).

如果您希望它运行得更快,请从一个集合中创建一个 HashSet,然后调用其removeAll() 方法。

【讨论】:

    【解决方案2】:

    要从一个集合中删除另一个集合中的所有项目,请使用removeAll

    items.removeAll(addedItems);
    

    【讨论】:

      【解决方案3】:

      您可以记下数组元素相同的所有数组索引(在两个数组中),并且您可以遍历两个列表,使用

      删除公共元素
      items.remove(index);
      

      方法。

      在没有完全遍历两个数组列表之前不要删除,因为当你删除一个元素时,所有后续元素的数组索引都会改变。

      否则,如果您想在一个循环本身中执行此操作,当您删除元素时,请将循环变量减一,以便为两个数组列表保持索引关联性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-17
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2010-12-12
        • 2019-11-15
        • 1970-01-01
        相关资源
        最近更新 更多