Java 8引入了Lambdas,它允许我们有效地从列表中删除所有元素。下面从myList中删除2的所有实例。
List<Integer> myList;
...
myList.removeIf(x -> x==2);如果我想删除N个元素(在本例中是3个),我将使用一个for循环。
for (int i = 0; i < 3; i++) {
myList.remove(Integer.valueOf(2));
}是否有方法使用Lambdas从列表中删除指定数量的元素?如果是这样的话,它是否比for循环代码更有效?
发布于 2021-05-26 16:29:28
当您重复调用remove(Object)时,从这两个方面都获得O(n平方)时间复杂度,从一开始就重复开始搜索(适用于所有List类型),并在列表是ArrayList或类似的情况下,在删除元素之后重复复制元素。
通过使用专用的搜索和删除循环,例如使用Iterator及其remove方法,可以避免搜索的时间复杂性。但是复制时间的复杂性仍然存在,除非您使用removeIf,并且list类用适当的实现覆盖它(就像ArrayList那样)。
利用这一优势去除n个匹配项的一种方法是
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)。
发布于 2021-05-26 15:03:58
您可以做一些接近于for-循环的操作:
IntStream.range(0,3).forEach(a-> integers.remove(Integer.valueOf(2)));就性能而言,它应该等同于for-循环。
发布于 2021-05-26 15:47:09
使用lambdas:
Runnable runnable = () -> {
for (int i = 0; i < 3; i++) {
myList.remove(Integer.valueOf(2));
}
};
runnable.run();开个玩笑。
https://stackoverflow.com/questions/67707196
复制相似问题