Java, как мне выполнить поиск по определенной переменной объектов, сохраненных в списке массивов

#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. Черт возьми. Чарли опередил меня.