#java #search #arraylist
#java #Поиск #arraylist
Вопрос:
У меня есть класс Personal, где я храню все объекты типа student, professor, tutor…
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)
?)
Ответ №1:
Вам Student
необходимо правильно реализовать equals
и hashCode
, и вы можете просто использовать List.contains
.
Ответ №2:
Выполните итерацию по списку, проверьте, равен ли текущий идентификатор учащегося тому, который вы ищете. Если да, верните true, иначе продолжайте. В конце итерации верните false .
Или, если вы хотите что-то более простое и быстрое, используйте a Map<String, Student>
вместо списка, сохраняя студентов, проиндексированных по их идентификатору. Вы можете использовать HashMap или LinkedHashMap, если вам нужно сохранить порядок вставки, как это делает список.
Комментарии:
1. Вместо этого я использовал HashMap, и это еще более эффективно. Спасибо
Ответ №3:
Очень упрощенная реализация, основанная на упоминании Бхеша о том, что equals и hashcode используют идентификатор студента:
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();
}
}
Ответ №4:
Предполагая, что строка StudentID является общедоступной или что у вас есть общедоступный метод Get для нее, вы можете использовать цикл Java For-each для проверки каждого элемента в списке:
for (Student s : activeStudentsList)
{
if (s.studentID == studentID)
return true;
}
return false;
Ответ №5:
Наслаждайтесь своим временем и не торопитесь использовать библиотеки 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;
}
Ответ №6:
Хорошо, вот моя версия. Избегайте циклов и условий завершения и еще много чего, а просто программируйте функционально, используя методы 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;
}
}
}
Это может показаться немного перегруженным для такого рода поиска, но я нахожу использование фильтров и преобразований очень полезным в более сложных сценариях.
Комментарии:
1. Черт возьми. Чарли опередил меня.