【问题标题】:Filter data based on condition from collection in the fastest way in Java在Java中以最快的方式根据集合中的条件过滤数据
【发布时间】:2018-01-15 18:51:01
【问题描述】:

我有一个包含近 600 个条目的自定义数组列表。

我需要根据某些条件过滤某些值。我尝试了基本循环的东西,但它非常耗时,我想要的是过滤数据的最快方法。

public class MyModel {
  private boolean attempeted = false;
  private String answer;

  public MyModel(String answer) {
    this.answer = answer;
  }

  public void setAttempted(boolean attempeted) {
    this.attempeted = attempeted;
  }

  public String getAnswer() {
    return answer;
  }

  public boolean isAttempeted() {
    return attempeted;
  }

}

以上是我想要的模型,我只需要获取具有尝试值为真的数据。这就是我所拥有的:

ArrayList<TestAnswerModel>myMainArrayList=array which contain all my data
ArrayList<TestAnswerModel>filterArrayList=new ArrayList<>();
for(int i=0;i<myMainArrayList.size();i++)
    {
        if(myMainArrayList.get(i).isAttempeted()) {
            filterArrayList.add(myMainArrayList.get(i))
        }
    }

以上工作正常,但如果我的数据太大,则需要很长时间。此外,有时数据为 600,而尝试的值仅适用于 2 或 3 个值,因此此循环将发生而没有任何结果。

我想要什么最快的方法来过滤数据。

【问题讨论】:

  • 我怀疑你的其他代码有这个问题。因为它对于 600 个条目应该非常快。好的..你能通过放置时间日志来测量循环所用的时间吗? (仅通过此循环测量时间,不包括您的数据获取逻辑
  • 我上面的方法是最快的方法吗?
  • 这是一个非常主观的问题,但你能回答我最初的问题吗?

标签: java performance arraylist filter


【解决方案1】:

您想收集列表中满足特定条件的所有条目。顺序循环基本上是到达那里的最快方式。如果您希望 5% 或 95% 的列表元素显示在结果列表中,这并没有什么不同 - 您必须查看 所有 条目来计算结果列表!

当然,您可以转向 streams 并进行过滤 - 因为这将允许您使用 parallelStream() 并并行处理列表的各个部分。

但是:600 个条目没什么。 600 个元素在现代硬件上被处理,眨眼的千分之一。

所以真正的答案是:在它真正成为问题之前不要担心性能。然后你profile你的应用程序来识别真正的性能瓶颈来解决这个问题。

【讨论】:

    【解决方案2】:

    在 Java 8 中,您可以像这样进行过滤:

    List<TestAnswerModel> filterArrayList = myMainArrayList.stream()
        .filter(m -> m.isAttempeted()).collect(Collectors.toList());
    

    无论您采用哪种方法,都应该在很短的时间内过滤掉包含 600 个对象的列表。正如其他人所说,您的性能问题可能出在代码的其他地方。

    【讨论】:

    • @halfer,从语法上讲是的,但是,isAttempeted() 是 OP 在他的类中定义方法的方式。
    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 2018-01-10
    • 2015-05-22
    • 2022-09-29
    • 1970-01-01
    • 2012-12-21
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多