我有一个包含近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个值为真,因此这种循环将在没有任何结果的情况下发生。
我想要任何最快的方法来过滤数据。
答案 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个对象的列表都应在无关紧要的时间内过滤。像其他人所说,你的性能问题可能在代码的其他地方。