【问题标题】:Filtering List without using iterator不使用迭代器过滤列表
【发布时间】:2011-08-05 05:15:39
【问题描述】:

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

1) 目前我正在迭代列表并使用 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);

谁能建议我如何在不迭代的情况下更快地获得子列表,或者如果使用迭代器,我会相对更快地获得结果。

【问题讨论】:

  • 1000 并不是一个很大的数字。而且它是一个顺序访问的列表,迭代是不可避免的。
  • 我认为迭代器在过滤过程中是不可避免的,因为必须检查每个元素。
  • @Nivas:你的评论应该是一个答案
  • @Jim Garrison,事后看来,是的。但正如其他人的回答一样,我不要。无论如何现在都没有增加多少价值。

标签: java collections guava


【解决方案1】:

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

如果你有一种非常专业的方式使用你的列表,这意味着你不会触及其中的每个元素,不要使用随机访问等,也许你不想要@ 987654322@ 接口。如果你能告诉我们更多关于你在做什么,那真的很有帮助。

【讨论】:

  • @Gabriel:我认为这一个答案:如果他需要 List 的通用接口,他将无法比遍历整个列表做得更好。如果他不需要需要整个List 接口,他可以使用不同的接口,这可能无需迭代就可行。
  • 理论上这并不完全正确。根据用途(如您所写),他可以将 List 与约束一起使用,以特定顺序添加到 List 等,以防止需要迭代整个 Collection 并保留 List。但这取决于,我不会给出这样的答案,我会发表评论以获取更多信息并在之后回答,为他的问题提供解决方案。由于这是主观的,我收回我的反对票(如果你编辑的话)。
  • @Gabriel:我不明白您如何摆脱对size() 检查每个元素的需要。无论哪种方式,我都将其视为与您的答案一样多的答案:它说明了为什么您不能一般在不检查每个元素(根据迭代器)的情况下逃脱,并提出了进一步的建议:即从结果中考虑 OP 实际需要什么。
  • 我不确定您所说的 size() 参数是什么意思。 ArrayList 和 LinkedList 在一个字段中记住它们的大小,该字段在每次改变大小的操作中都会更新。 size() 方法只返回该字段的值,它不检查任何内容。你能解释一下你的意思吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我丰富了我的评论: 我认为迭代器在过滤过程中是不可避免的,因为必须检查每个元素。

    关于Collections2.filter,它不同于简单的过滤器:返回的Collection 仍然是“Predicated”。这意味着如果将不满意的元素添加到Collection,将抛出IllegalArgumentException

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-12-23
        • 1970-01-01
        • 2011-08-05
        • 2015-06-11
        • 2015-07-27
        • 1970-01-01
        • 2016-04-12
        • 2019-11-30
        • 2017-05-30
        相关资源
        最近更新 更多