Java 无迭代过滤列表
在Java中,是否可以基于某些标准过滤列表而无需迭代?我有一个10000大小的bean列表,其中的bean具有布尔类型的属性。如果我想根据布尔属性过滤列表,是需要迭代整个列表还是有其他方法 如果您的意思是,不使用Java 无迭代过滤列表,java,collections,filter,Java,Collections,Filter,在Java中,是否可以基于某些标准过滤列表而无需迭代?我有一个10000大小的bean列表,其中的bean具有布尔类型的属性。如果我想根据布尔属性过滤列表,是需要迭代整个列表还是有其他方法 如果您的意思是,不使用迭代器,那么答案是肯定的。例如: for (int i = 0; i < list.size(); ) { MyElement element = list.get(i); if (element.getMyProperty()) { list.re
迭代器,那么答案是肯定的。例如:
for (int i = 0; i < list.size(); ) {
MyElement element = list.get(i);
if (element.getMyProperty()) {
list.remove(i);
} else {
i++;
}
}
for(int i=0;i
根据列表
实现的不同,与使用迭代器
和迭代器.remove()
相比,这可能是一种昂贵的过滤实现方式。(例如,如果列表是一个LinkedList
,那么list.get(i)
和list.remove(i)
都是O(N)
,因此列表过滤是O(N^2)
。相比之下,使用迭代器对同一列表进行过滤将是O(N)
)
但是,如果您询问是否可以在不检查列表中的每个元素的情况下过滤列表,那么答案是否定的。您需要一些辅助数据结构,或者在属性上对列表进行排序,以实现优于O(N)
过滤。如果您的意思是,不使用迭代器,那么答案是肯定的。例如:
for (int i = 0; i < list.size(); ) {
MyElement element = list.get(i);
if (element.getMyProperty()) {
list.remove(i);
} else {
i++;
}
}
for(int i=0;i
根据列表
实现的不同,与使用迭代器
和迭代器.remove()
相比,这可能是一种昂贵的过滤实现方式。(例如,如果列表是一个LinkedList
,那么list.get(i)
和list.remove(i)
都是O(N)
,因此列表过滤是O(N^2)
。相比之下,使用迭代器对同一列表进行过滤将是O(N)
)
但是,如果您询问是否可以在不检查列表中的每个元素的情况下过滤列表,那么答案是否。您需要一些辅助数据结构,或者在属性上对列表进行排序,以实现优于O(N)
筛选。您有一个包含10000件物品的列表,您希望能够神奇地按照某些标准选择其中的一些物品,而无需依次查看每个物品是否符合标准?嗯。。。不,您可能会找到一个对您隐藏迭代的库,但最终你必须访问每个项目,看看它是否匹配。你有一个包含10000个项目的列表,你想神奇地按照一些标准选择其中的一些,而不需要依次访问每个项目,看看它是否匹配标准?嗯。。。不。您可能会找到一个对您隐藏迭代的库,但最终您必须访问每个项以查看它是否匹配。您可以编写一个实现列表接口的包装器类,并使用所述属性“隐藏”所有bean。但是,很多操作(例如,每个基于索引的函数)都会非常低效,因此这取决于您希望如何处理“筛选”列表 您可以编写一个包装器类来实现List接口,并使用所述属性“隐藏”所有bean。但是,很多操作(例如,每个基于索引的函数)都会非常低效,因此这取决于您希望如何处理“筛选”列表 您可以使用Java8中的流来实现这一点。假设您有电动汽车和非电动汽车的列表,并且只想提取电动汽车:
List<Car> electricCars= cars.stream().filter(c -> c.isElectric()).collect(Collectors.toList());
List electricCars=cars.stream().filter(c->c.isElectric()).collect(collector.toList());
您可以使用Java8中的流来实现这一点。假设您有电动汽车和非电动汽车的列表,并且只想提取电动汽车:
List<Car> electricCars= cars.stream().filter(c -> c.isElectric()).collect(Collectors.toList());
List electricCars=cars.stream().filter(c->c.isElectric()).collect(collector.toList());
即使没有迭代器,仍然有迭代在进行。谢谢@Stephen C。不过,您提供的示例可以迭代该列表。我不明白你在做什么样的昂贵的实现。您可以提供任何web链接或示例吗?@Tapas:例如,在LinkedList
上调用get(int)
最多需要迭代列表的一半才能找到元素,在这种情况下,使用迭代器将更有效。请阅读有关此主题的讨论。哦,对不起。我没看到。我将删除以前的评论。:-)即使没有迭代器
,迭代仍在进行。谢谢@Stephen C。不过,您提供的示例可以迭代该列表。我不明白你在做什么样的昂贵的实现。您可以提供任何web链接或示例吗?@Tapas:例如,在LinkedList
上调用get(int)
最多需要迭代列表的一半才能找到元素,在这种情况下,使用迭代器将更有效。请阅读有关此主题的讨论。哦,对不起。我没看到。我将删除以前的评论。:-)另一种选择是做一些前期工作:如果你有一个索引(可能是两个独立的列表
对象的形式,一个为真
,另一个为假
),那么它会更快(实际上花费的时间会转移到更新上,但如果你经常阅读,这会有回报)。数据库基本上就是这样做的。另一种选择是做一些前期工作:如果你有一个索引(可能是以两个独立的列表
对象的形式,一个为真
,另一个为假
),那么它会更快(实际上花费的时间会转移到更新上,但如果你经常阅读