Java,如何搜索保存在数组列表中的对象的特定变量

时间:2011-10-28 15:37:39

标签: java search arraylist

我有一个Personnel类,我存储所有类型的学生,教授,导师......

class Personnel {
     ArrayList<Student> activeStudentsList = new ArrayList<Student>();
}

我有一个班级学生

class Student extends Person {
    public Student (String studentID, String firstName, String lastName) {
        super(firstName, lastName);
        this.studentID = studentID;
    }
}

现在,在将学生添加到数组列表之前,我想要做的是检查他是否已经存在。我正在使用它:

private boolean isStudentActive(String studentID) {
    if (activeStudentsList.contains(studentID)) {
        System.out.println("The student " + studentID + " is already on the list.");
        return true;
    } else
        return false; 
}

问题是,我的数组列表是ArrayList<Student>,因此我无法搜索特定的字符串(studentID)。我该怎么做呢?如何仅搜索列表中每个对象的字符串studentID? 编辑:(有没有像activeStudentsList.studentID.contains(studentID)?)

6 个答案:

答案 0 :(得分:10)

您的Student需要正确实施equalshashCode,您只需使用List.contains

答案 1 :(得分:4)

遍历列表,测试当前学生的ID是否等于您要查找的ID。如果是,则返回true,否则继续。在迭代结束时,返回false。

或者,如果您想要更简单,更快捷的内容,请使用Map<String, Student>代替列表,存储按ID标记的学生。如果需要像List一样保留插入顺序,可以使用HashMap或LinkedHashMap。

答案 2 :(得分:2)

基于Bhesh提到的使用equals和hashcode的一个非常简单的实现使用学生ID:

class Student extends Person {

    private String studentID;

    public Student (String studentID, String firstName, String lastName) {
        super(firstName, lastName);
        this.studentID = studentID;
    }

    @Override
    public boolean equals(Object object) {
        if(object instanceof Student) {
            Student s = (Student) object;
            return this.studentID.equals(s.studentID);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return studentID.hashCode();
    }
}

答案 3 :(得分:1)

假设studentID字符串是public或者你有一个公共的Get方法,你可以使用Java For-each循环来检查列表中的每个元素:

for (Student s : activeStudentsList)
{
   if (s.studentID == studentID)
      return true;
}
return false;

答案 4 :(得分:1)

享受您的时间并花时间使用Guava图书馆: http://code.google.com/p/guava-libraries/

try
        {
            Person item = Iterables.find(this.personList,
                    new Predicate<Person>() {
                        public boolean apply(Person q)
                        {
                            return itemId.equals(q.getId());
                        }
                    });
            return item;
        } catch (NoSuchElementException exception)
        {
            return null;
        }

答案 5 :(得分:0)

好的,这是我的版本。避免循环和终止条件等等,并使用Google的Guava方法进行功能编程:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.TreeMultimap;

public class TestClass {

    class Person {
        private String firtName = null;
        private String lastName = null;

        public Person(String firtName, String lastName) {
            super();
            this.firtName = firtName;
            this.lastName = lastName;
        }
    };

    class Student extends Person {
        private String studentID = null;

        public Student(String studentID, String firstName, String lastName) {
            super(firstName, lastName);
            this.studentID = studentID;
        }

        public String getStudentID() {
            return studentID;
        }
    }

    class Personnel {
        ArrayList<Student> activeStudentsList = new ArrayList<Student>();

        public boolean isStudentActive(final String studentID) {
            return Iterables.size(Iterables.filter(activeStudentsList,
                    new Predicate<Student>() {
                        @Override
                        public boolean apply(Student arg0) {
                            return arg0.getStudentID().equals(studentID);
                        }
                    })) == 1;
        }
    }

}

对于这种搜索来说,这似乎有点头重脚轻,但我发现使用过滤器和变换在更复杂的场景中非常有用。