我想在ExArrayList
搜索特定的gpa?如果它存在于ArrayList中,我想要一个真或假的答案。
public class ExArrayList {
private String Name;
private double GPA;
public ExArrayList(String name, double gpa) {
this.Name = name;
this.GPA = gpa;
}
public void setGPA(double gpa) {
this.GPA = gpa;
}
public double getGPA() {
return GPA;
}
public void setName(String name) {
this.Name = name;
}
public String getName() {
return Name;
}
@Override
public String toString() {
return String.format("%s\t%f", this.Name, this.GPA);
}
}
public class Main {
public static void main(String[] args) {
ArrayList<ExArrayList> psy101 = new ArrayList<>();
psy101.add(new ExArrayList("Bob", 2.9 ));
psy101.add(new ExArrayList("Steve", 3.9 ));
psy101.add(new ExArrayList("Charles", 4.0 ));
System.out.println();
System.out.printf("Student\tGPA\n");
for(ExArrayList s : psy101) {
System.out.printf("%s\n", s);
}
boolean binFound = psy101.contains(2.9); // This is what I am using to search the ArrayList. It's not working.
System.out.println("Does the list contain GPA of 2.9? " + binFound);`
答案 0 :(得分:4)
您可以在列表中循环并使用lambda来查找匹配项:
boolean binFound = psy101.stream().anyMatch(g -> g.getGPA() == 2.9);
答案 1 :(得分:0)
你必须在for循环中进行比较。
if(s.getGPA == 2.9){
binFound = true;
break;
}
答案 2 :(得分:0)
没有Java8 Streams:
boolean binFound = false;
for(ExArrayList exArrayList : psy101) {
if(exArrayList.getGPA() == 2.9) {
binFound = true;
break;
}
}
System.out.println(binFound);
使用Java8 Streams:
boolean binFound = psy101.stream().map(ExArrayList::getGPA).
anyMatch(gpa -> gpa == 2.9);
System.out.println(binFound);
答案 3 :(得分:-1)
我不喜欢这些答案中的任何一个。人们忘记了在尝试比较doubles
时出现的精度错误。我知道它对于GPA目的来说不应该太糟糕,因为它没有涉及很多精度。但是,有正确的方法或正确的做事方式。
有关说明,请参阅this和this。
正在进行规划的正确方法是使用二进制搜索。但是,首先需要对列表进行排序才能使其正常工作。
如何在Java中对象进行排序?您首先需要知道如何比较它们的值,并且有几种方法可以做到这一点。对于我的例子,我将使用Comparable
。检查this是否有学习目的。
在任何事情之前使用此导入
import java.util.*;
现在,我们在您的对象中implement Comparable
。在更改后它将如下所示:
public class ExArrayList implements Comparable<ExArrayList> {
private String Name;
private double GPA;
public ExArrayList(String name, double gpa) {
this.Name = name;
this.GPA = gpa;
}
public void setGPA(double gpa) {
this.GPA = gpa;
}
public double getGPA() {
return GPA;
}
public void setName(String name) {
this.Name = name;
}
public String getName() {
return Name;
}
@Override
public String toString() {
return String.format("%s\t%f", this.Name, this.GPA);
}
//new stuff needed to compare the objects
public int compareTo(ExArrayList other) {
return Double.compare(this.GPA, other.GPA);
}
}
现在我们可以通过执行以下操作对您的列表进行排序:
Collections.sort(psy101);
对它进行排序后,我们可以通过执行以下操作来搜索对象的索引:
//here we must pass a fake object with the value that we are trying to find
int index = Collections.binarySearch(psy101, new ExArrayList(null, 2.9));
System.out.println(index >= 0 ? "True" : "False");
index
包含列表中2.9的位置为0,如果未找到则包含负数。