#java #arraylist
#java #arraylist
Вопрос:
Я использую этот код, чтобы проверить, есть ли объект уже в списке
myClientList.contains(client);
Я хочу исключить некоторые свойства при проверке наличия клиента в списке, такие как adress
, age
… и просто проверить firstName
, lastName
и возраст. Есть ли какая-либо возможность сделать это при использовании myClientList.contains
или я должен написать свою собственную функцию для этого?
Комментарии:
1.
myClientList.contains(client);
зависит от реализацииequals
метода. вы должны реализовать это соответствующим образом, если это соответствует общему равенству ваших клиентских объектов. (hashcode
тогда не забудьте) в противном случае, если вам нужно только somehow_temporary_ определение равенства, вам лучше использовать какую-то фильтрацию.2.
contains
отключаетсяequals
. Вы могли бы переопределитьequals
класс client и заставить его проверять только определенные поля. В качестве альтернативы, выполните итерацию по списку и проверьте вручную.
Ответ №1:
Ответ @El Sam в порядке, но он не подходит для реального word, потому что могут быть два человека с одинаковыми именем, фамилией и возрастом, поэтому использование equals / hashcode не является хорошим выбором.
Для вашего случая. Лучше, если вы напишите свою собственную функцию. Просто напишите цикл и проверьте условие.
Если вы используете Java 8, вы можете использовать лямбда-выражение.
myClientList.stream().anyMatch( r ->
r.getFirstName().equals(client.getFirstName()) amp;amp;
r.getLastName().equals(client.getLastName()) amp;amp;
r.getAge() == client.getAge()
);
Ответ №2:
contains
Метод основан на equals
методе вашего Client
класса, поэтому вам следует пересмотреть equals
метод в соответствии с вашими потребностями, поступайте как товарищ:
@Override
public boolean equals(Object object){
if(object == null)
return false;
else if(!(object instanceof Client))
return false;
else {
Client client = (Client)object;
if(firstName.equals(client.getFirstName()) amp;amp;
lastName.equals(client.getLastName() amp;amp;
age.equals(client.getAge()))
{
return true;
}
}
return false;
}
В противном случае вы можете проверить наличие этих атрибутов вручную во время итерации.
Ответ №3:
Из contains возвращает True вы можете выполнить итерацию коллекции и найти этот объект и исключить свойства
Ответ №4:
java.util.List.contains(Object o)
полагается на равенство объектов с точки зрения Object.equals(Object o)
метода. Он обладает сильной семантикой.
Знание того, обладает ли объект некоторыми свойствами, равными другому объекту, такими как имя и фамилия, не должно иметь отношения к equals
методу, потому что это не имеет отношения к идентификации клиента (этого недостаточно, как упоминал @Loc). Это скорее метод поиска с некоторыми критериями.
Итак, на вашем месте я бы создал сервис для выполнения операций поиска на клиентах или я бы создал свой собственный список, который реализует List
, но который также предоставляет метод поиска, соответствующий моим потребностям.