Java, як шукати певну змінну об'єктів, збережених у списку масивів

У мене є клас персоналу, де я зберігаю всі об'єкти типу студента, професора, репетитора ...

class Personnel {
     ArrayList activeStudentsList = new ArrayList();
}

і у мене є клас Студент

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; 
}

The problem is, my array list is ArrayList, so I can't search for a specific String (studentID). How do I do this? How do I only search String studentID of each object on the list? EDIT: (Is there somethin like activeStudentsList.studentID.contains(studentID) ?)

1

6 Відповіді

Ваш Student має правильно реалізувати equals та hashCode , і ви можете просто використовувати List.contains .

10
додано

Ітератуйте через список, перевірте, чи поточний ідентифікатор студента дорівнює тому, що ви шукаєте. Якщо так, поверніться істинно, інакше продовжуйте. Наприкінці ітерації повернення помилково.

Or, if you want something easier and faster, use a Map instead of the list, storing the students indexed by their ID. You may use a HashMap, or LinkedHashMap if you need to preserve the insertion order like a List does.

4
додано
Замість цього я використав HashMap, і це ще більш ефективно. Дякую
додано Автор vedran, джерело

Дуже спрощене впровадження, засноване на згадці Блеша про створення рівних і хеш-кодів, використовують ідентифікатор студента:

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();
    }
}
2
додано

Насолоджуйся своїм часом і займіть час, щоб використовувати гуавські бібліотеки: http://code.google.com/p/guava-libraries/ .

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

Припускаючи, що рядок studentID є загальнодоступним або що у вас є загальнодоступний метод Get для нього, ви можете використовувати цикл Java For-each, щоб перевірити кожен елемент у списку:

for (Student s : activeStudentsList)
{
   if (s.studentID == studentID)
      return true;
}
return false;
1
додано

ОК, ось моя версія. Уникайте циклів і припиняйте умови, а також просто, програмування за допомогою методів Google Гуава:

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 activeStudentsList = new ArrayList();

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

}

Це може здатися трохи важким для такого роду пошуку, але я вважаю використання фільтрів і перетворень дуже корисним у більш складних сценаріях.

0
додано
Палки. Чарлі побили мене.
додано Автор Steve J, джерело
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників