Java 无迭代过滤列表

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

在Java中,是否可以基于某些标准过滤列表而无需迭代?我有一个10000大小的bean列表,其中的bean具有布尔类型的属性。如果我想根据布尔属性过滤列表,是需要迭代整个列表还是有其他方法

如果您的意思是,不使用
迭代器,那么答案是肯定的。例如:

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)
最多需要迭代列表的一半才能找到元素,在这种情况下,使用
迭代器将更有效。请阅读有关此主题的讨论。哦,对不起。我没看到。我将删除以前的评论。:-)另一种选择是做一些前期工作:如果你有一个索引(可能是两个独立的
列表
对象的形式,一个为
,另一个为
),那么它会更快(实际上花费的时间会转移到更新上,但如果你经常阅读,这会有回报)。数据库基本上就是这样做的。另一种选择是做一些前期工作:如果你有一个索引(可能是以两个独立的
列表
对象的形式,一个为
,另一个为
),那么它会更快(实际上花费的时间会转移到更新上,但如果你经常阅读