如何在ArrayList中搜索项目?

时间:2016-10-27 17:21:17

标签: java

我想在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);`

4 个答案:

答案 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目的来说不应该太糟糕,因为它没有涉及很多精度。但是,有正确的方法或正确的做事方式。  有关说明,请参阅thisthis

正在进行规划的正确方法是使用二进制搜索。但是,首先需要对列表进行排序才能使其正常工作。

如何在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,如果未找到则包含负数。