首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列表中删除元素的第一次出现

从列表中删除元素的第一次出现
EN

Stack Overflow用户
提问于 2021-05-26 14:40:03
回答 4查看 1.2K关注 0票数 6

Java 8引入了Lambdas,它允许我们有效地从列表中删除所有元素。下面从myList中删除2的所有实例。

代码语言:javascript
复制
List<Integer> myList;
...
myList.removeIf(x -> x==2);

如果我想删除N个元素(在本例中是3个),我将使用一个for循环。

代码语言:javascript
复制
for (int i = 0; i < 3; i++) {
    myList.remove(Integer.valueOf(2));
}

是否有方法使用Lambdas从列表中删除指定数量的元素?如果是这样的话,它是否比for循环代码更有效?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-05-26 16:29:28

当您重复调用remove(Object)时,从这两个方面都获得O(n平方)时间复杂度,从一开始就重复开始搜索(适用于所有List类型),并在列表是ArrayList或类似的情况下,在删除元素之后重复复制元素。

通过使用专用的搜索和删除循环,例如使用Iterator及其remove方法,可以避免搜索的时间复杂性。但是复制时间的复杂性仍然存在,除非您使用removeIf,并且list类用适当的实现覆盖它(就像ArrayList那样)。

利用这一优势去除n个匹配项的一种方法是

代码语言:javascript
复制
int n = 3;
int last = IntStream.range(0, myList.size())
    .filter(ix -> myList.get(ix) == 2)
    .limit(n)
    .reduce((a,b) -> b)
    .orElse(-1);
myList.subList(0, last + 1).removeIf(x -> x == 2);

它更复杂,对于小清单,它将是更昂贵的。然而,对于真正重要的时间复杂性的大列表,它将受益于O(n)时间复杂性。

注意,当谓词是一个简单的匹配操作时,您也可以使用,例如removeAll(Collections.singleton(2))而不是removeIf(x -> x == 2)

票数 9
EN

Stack Overflow用户

发布于 2021-05-26 15:03:58

您可以做一些接近于for-循环的操作:

代码语言:javascript
复制
IntStream.range(0,3).forEach(a-> integers.remove(Integer.valueOf(2)));

就性能而言,它应该等同于for-循环。

票数 0
EN

Stack Overflow用户

发布于 2021-05-26 15:47:09

使用lambdas:

代码语言:javascript
复制
Runnable runnable = () -> {
    for (int i = 0; i < 3; i++) {
        myList.remove(Integer.valueOf(2));
    }
};
runnable.run();

开个玩笑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67707196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档