Убедитесь, что есть комбинация уникальной строки - PullRequest
0 голосов
/ 01 декабря 2018
class Details{
 String name;
 String age;
 String email;
 String location;
}

1) Если есть Список подробностей, как в List<Details>, как проверить комбинацию имени и адреса электронной почты, которые в совокупности уникальны.(т.е.) Для одного адреса электронной почты не может быть двух записей.

2) Как проверить комбинацию всех полей в файле класса, является уникальным.

Какая будет идеальная структура данных для решения этой проблемы?.

Ответы [ 4 ]

0 голосов
/ 01 декабря 2018

Когда вы переопределяете метод equals внутри любого объекта, вы можете точно проверить равенство этого объекта с другим , даже если они находятся где-то в памяти в другом месте.

Таким образом, приведенный ниже код

myList.contains (myObject);

ответит, если в myList есть объект, который метод equals возвращает true с myObject,

Во всех основных IDE (таких как intelliJ, netbeans, eclipse и т. Д.) IDE поможет вам точно переопределить метод equals.вот автоматически сгенерированный код для переопределения метода equals с использованием intelliJ IDE

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Details details = (Details) o;
    return Objects.equals(name, details.name) &&
            Objects.equals(email, details.email);
}

Теперь, если вы хотите избежать дублирования, добавляемого в ваш список, вы должны использовать Set вместо List . A Set добавит новый элемент , если комбинация из hashCode и равно метод отличается (сравнивая существующий объект и вновь предназначенный для добавления объекта)

Поэтому мы должны переопределить метод hashCode (сгенерированный IntelliJ IDE) , если мы хотим использоватьвариант Set class :

@Override
public int hashCode() {
    return Objects.hash(name, email);
}

Теперь, если вы создадите Set и попытаетесь добавить два объекта с похожим именем и адресом электронной почты внутри этого Set, набор будет только добавлятьпервое уникальное имя и адрес электронной почты, даже если другие поля второго объекта имеют разные значения

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

class Details {
    String name;
    String age;
    String email;
    String location;

    public Details(String name, String age, String email, String location) {
        this.name = name;
        this.age = age;
        this.email = email;
        this.location = location;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Details details = (Details) o;
        return Objects.equals(name, details.name) &&
                Objects.equals(email, details.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, email);
    }

    @Override
    public String toString() {
        return String.format("(name: %s, age: %s, email: %s, location: %s)", name, age, email, location);
    }

    public static void main(String[] args) {
        Set<Details> mySet = new HashSet<>();
        mySet.add(new Details("Mehdi", "12", "123@xyz.com", "Los Angeles"));
        mySet.add(new Details("Mehdi", "34", "123@xyz.com", "Las Vegas"));
        System.out.println(mySet);
    }

}

Это целое тестовое приложение. Существуетчто-то еще, что стоит упомянуть.если в любом случае вы сохранили свои данные в списке и хотите удалить дубликаты в соответствии с вашими правилами (бывшее имя, адрес электронной почты), вы можете попробовать этот подход:

Set<Details> mySet = new HashSet<>(myList);

КакойmyList - это ваш список. , поэтому в вашем приложении это будет выглядеть так:

public static void main(String[] args) {
    List<Details> myList = new ArrayList<>();
    myList.add(new Details("Mehdi", "12", "123@xyz.com", "Los Angeles"));
    myList.add(new Details("Mehdi", "34", "123@xyz.com", "Las Vegas"));

    Set<Details> mySet = new HashSet<>(myList);
    System.out.println(mySet);
}

и вот результат без дубликатов:

[(name: Mehdi, возраст: 12 лет, электронная почта: 123@xyz.com, местоположение: Лос-Анджелес)]

0 голосов
/ 01 декабря 2018

Помимо использования хеша, предложенного @OmG, вы также можете использовать TreeSet с ключом, представляющим собой конкатенацию уникальных полей, также используя разделитель между ними.

A Set допускает только уникальные ключи.

0 голосов
/ 01 декабря 2018

Если вам нужно получить только уникальные значения, вы должны использовать Set .Вы должны использовать свою собственную реализацию equals & hashCode, например, для случая 1):

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Details details = (Details) o;
    return Objects.equals(name, details.name) &&
            Objects.equals(email, details.email);
}

@Override
public int hashCode() {

    return Objects.hash(name, email);
}

Если вам нужно, чтобы все элементы Details были уникальными, просто обновите хэш и равните реализацию с необходимыми свойствами.

0 голосов
/ 01 декабря 2018

Вы можете хешировать значения с помощью разделителя, например #, и затем обнаруживать, что все они уникальны или нет.Значение хеша для Details равно name + "#" + "email в первом случае и name + "#" + age + "#" + email + "#" + location во втором случае.Вы можете использовать Hashmap, чтобы найти дубликаты, если они есть с указанным ключом (или хэшем) для каждого экземпляра Details.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...