2011-08-05 48 views
2

我需要过滤大小为1000或更大的列表并从中获取子列表。 我不想使用迭代器。在不使用迭代器的情况下过滤列表

1)目前我正在迭代List并使用Java进行比较。这是一项耗时的工作。我需要提高我的代码的性能。

2)我也尝试使用Google Collections(Guava),但我认为它也会在后台进行迭代。

Predicate<String> validList = new Predicate<String>(){ 
     public boolean apply(String aid){ 
      return aid.contains("1_15_12"); 
     } 
    }; 
    Collection<String> finalList =com.google.common.collect.Collections2.filter(Collection,validList); 

任何人都可以建议我怎么能得到更快的子表不反复或者,如果使用迭代器我会得到比较结果更快。

+5

1000不是一个很大的数字。它是一个顺序访问的列表,迭代是不可避免的。 – Nivas

+1

我认为迭代器在过滤期间是不可避免的,因为每个元素都必须被检查。 –

+0

@Nivas:你的评论应该是一个回答 –

回答

0

列表是对象的有序集合。所以你必须迭代它才能过滤。

+0

对不起,Nivas似乎已经回答了这个问题...... – never

2

考虑如果您在子列表中调用size()会发生什么情况。那检查每个元素,因为每个元素可能会改变结果。

如果您在使用您的列表,这意味着你不接触的每一个元素在里面,不使用随机访问等一个非常特殊的方式,也许你不想List接口都没有。如果你能告诉我们更多关于你在做什么,那真的会有所帮助。

+0

好评,不好回答。 –

+0

@ Gabriel:我认为它*是一个答案:如果他需要List的一般接口,他将无法比遍历整个列表做得更好。如果他*不需要整个'List'接口,他可以使用不同的接口,这可能是可行的,而无需迭代。 –

+0

从理论上讲,这不完全正确。根据使用情况(如您所写),他可以使用List with Constraints,按特定顺序添加到List中,以防止迭代整个Collection并停留在List上。但这取决于,我不会给出这样的答案,我会把它作为一个评论,以获得更多的信息和事后回答,给他一个解决他的问题。由于这是主观的,我收回我的downvote(如果你编辑)。 –

0

我充实了我的意见: 我认为迭代器在过滤期间是不可避免的,因为每个元素都必须被检查。

关于Collections2.filter,它与简单过滤器不同:返回的Collection仍为“被预测”。这意味着如果将不满意的元素添加到Collection,则会抛出IllegalArgumentException

0

如果性能真的是你关心的问题,那么很可能谓词很慢。你可以做什么是Lists.partition你的列表,并行过滤(你必须写这个),然后连接结果。

可能有更好的方法来解决您的问题,但我们需要更多关于谓词和列表中数据的信息。

相关问题