Исключить некоторые свойства при поиске объекта в списке

#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 , но который также предоставляет метод поиска, соответствующий моим потребностям.