在Java

时间:2017-08-08 09:16:59

标签: java performance arraylist filter

我有一个包含近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个值为真,因此这种循环将在没有任何结果的情况下发生。

我想要任何最快的方法来过滤数据。

2 个答案:

答案 0 :(得分:3)

您希望收集列表中符合特定条件的所有条目。顺序循环基本上是达到目的的最快方式。如果您期望5%或95%的列表元素显示在结果列表中,那么它不会产生任何影响 - 您必须查看所有条目以计算结果列表!< / p>

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

:600条目。 600个元素在现代硬件上以万亿分之一的眨眼进行处理。

所以真正的答案:在真正成为问题之前不要担心性能。然后,您配置文件您的应用程序,以确定真正的性能瓶颈,以解决这个问题。

答案 1 :(得分:1)

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

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

无论采用何种方法,600个对象的列表都应在无关紧要的时间内过滤。像其他人所说,你的性能问题可能在代码的其他地方。