Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何有效地从列表中删除元素_Java_List - Fatal编程技术网

Java如何有效地从列表中删除元素

Java如何有效地从列表中删除元素,java,list,Java,List,好的,这是我头上的概念证明,已经困扰了我好几天了: 假设我有: List<String> a = new ArrayList<String>(); a.add("foo"); a.add("buzz"); a.add("bazz"); a.add("bar"); for (int i = 0; i < a.size(); i++) { String str = a.get(i); if (!str.equals("foo") || !str.equ

好的,这是我头上的概念证明,已经困扰了我好几天了:

假设我有:

List<String> a = new ArrayList<String>();
a.add("foo");
a.add("buzz");
a.add("bazz");
a.add("bar");

for (int i = 0; i < a.size(); i++)
{
    String str = a.get(i);
    if (!str.equals("foo") || !str.equals("bar")) a.remove(str);
}
List a=new ArrayList();
a、 添加(“foo”);
a、 添加(“嗡嗡声”);
a、 添加(“bazz”);
a、 添加(“酒吧”);
对于(int i=0;i
这将以列表[“foo”、“bazz”、“bar”]结束,因为它将读取索引1(“buzz”)处的字符串,删除它,索引2(“bazz”)处的字符串将跳转到索引1,并且将绕过它而不进行验证

我想到的是:

List<String> a = new ArrayList<String>();
a.add("foo");
a.add("buzz");
a.add("bazz");
a.add("bar");

for (int i = 0; i < a.size(); i++)
{
    String str = a.get(i);
    boolean removed = false;
    if (!str.equals("foo") || !str.equals("bar"))
    {
        a.remove(str);
        removed = true;
    }
    if (removed) i--;
}
List a=new ArrayList();
a、 添加(“foo”);
a、 添加(“嗡嗡声”);
a、 添加(“bazz”);
a、 添加(“酒吧”);
对于(int i=0;i
它应该是这样工作的(至少在我的脑海中是这样的,lol),但是使用for迭代器并不是很好的实践

我认为另一种方法是创建一个“删除列表”,并将需要从列表a中删除的项目添加到该列表中,但这只是纯粹的资源浪费


那么,有效地从列表中删除项目的最佳实践是什么呢?

请改用
迭代器
并使用
迭代器#remove
方法:

for (Iterator<String> it = a.iterator(); it.hasNext(); ) {
    String str = it.next();
    if (!str.equals("foo") || !str.equals("bar")) {
        it.remove();
    }
}
for(Iterator it=a.Iterator();it.hasNext();){
String str=it.next();
如果(!str.equals(“foo”)| |!str.equals(“bar”)){
it.remove();
}
}

根据你的问题:

使用for迭代器不是很好的实践

事实上,如果您直接使用
List
而不是
ArrayList
,那么使用
get
方法可以在所有集合中导航以获得所需的元素(例如,如果您有一个由单个链接列表支持的
List
)。因此,这里的最佳实践是使用迭代器,而不是使用
get

有效地从列表中删除项目的最佳实践是什么


不仅对于
列表
s,而且对于任何支持的
集合
,并且假设您没有索引或某种键(如
映射
)来直接访问元素,删除元素的最佳方法是使用
迭代器#remove

使用
迭代器
,然后使用
迭代器#remove
方法:

for (Iterator<String> it = a.iterator(); it.hasNext(); ) {
    String str = it.next();
    if (!str.equals("foo") || !str.equals("bar")) {
        it.remove();
    }
}
for(Iterator it=a.Iterator();it.hasNext();){
String str=it.next();
如果(!str.equals(“foo”)| |!str.equals(“bar”)){
it.remove();
}
}

根据你的问题:

使用for迭代器不是很好的实践

事实上,如果您直接使用
List
而不是
ArrayList
,那么使用
get
方法可以在所有集合中导航以获得所需的元素(例如,如果您有一个由单个链接列表支持的
List
)。因此,这里的最佳实践是使用迭代器,而不是使用
get

有效地从列表中删除项目的最佳实践是什么


不仅对于
列表
s,而且对于任何支持的
集合
,并且假设您没有索引或某种键(如
映射
)来直接访问元素,删除元素的最佳方法是使用
迭代器#remove
,您的第一个示例可能会导致一个错误,因为一旦你删除了一个对象,你列表的索引就会改变。如果您想快速完成,请使用
迭代器
或列表自己的
。remove()
函数:

Iterator<String> itr = yourList.iterator();
while (itr.hasNext()) {
    if ("foo".equals(itr.next()) {
        itr.remove();
    }
}

您的第一个示例可能会导致一个错误,因为一旦您删除一个对象,列表的索引就会改变。如果您想快速完成,请使用
迭代器
或列表自己的
。remove()
函数:

Iterator<String> itr = yourList.iterator();
while (itr.hasNext()) {
    if ("foo".equals(itr.next()) {
        itr.remove();
    }
}

您有三个主要选择:

  • 请使用,因为它上面有方便的方法。:-)

  • 改为使用
    while
    循环,并且仅在不删除项目的情况下增加索引变量

    int index = 0;
    while (index < list.size()) {
        if (/*...you want to remove the item...*/) {
            list.removeAt(index);
        } else {
            // Not removing, move to the next
            ++index;
        }
    }
    
    int索引=0;
    while(索引

  • 请记住,除非您知道您正在处理
    ArrayList
    ,否则
    List#get(int)
    的成本可能很高(可能是一次遍历)。但是如果您知道您正在处理
    ArrayList
    (或类似),那么…

    您有三个主要选择:

  • 请使用,因为它上面有方便的方法。:-)

  • 改为使用
    while
    循环,并且仅在不删除项目的情况下增加索引变量

    int index = 0;
    while (index < list.size()) {
        if (/*...you want to remove the item...*/) {
            list.removeAt(index);
        } else {
            // Not removing, move to the next
            ++index;
        }
    }
    
    int索引=0;
    while(索引

  • 请记住,除非您知道您正在处理
    ArrayList
    ,否则
    List#get(int)
    的成本可能很高(可能是一次遍历)。但是,如果您知道您正在处理
    ArrayList
    (或类似),那么…

    ArrayList.retainal
    有一个“智能”实现,它做的事情是线性时间。您只需使用
    list.retainal(Arrays.asList(“foo”,“bar”))
    ,就可以在这一行中获得快速实现。

    ArrayList.retainal
    有一个“智能”实现,它可以正确地实现线性时间。您只需使用
    list.retainal(Arrays.asList(“foo”,“bar”))
    就可以在这一行中得到快速实现。

    您应该使用迭代器。可能是的副本确实我可以删除第二个if,但当我想到它时