Как добавить уникальные значения в мою хэш-карту - PullRequest
0 голосов
/ 11 февраля 2019

Я создал один класс Employee с парой переменных экземпляра.при инициализации объектов я давал те же значения в свойствах моего сотрудника.Я сгенерировал свой собственный хэш-код и метод .equals из eclipse.Для добавления этих элементов в комплекте отлично работает.Но при добавлении в карту я запутался.Нужны советы.

класс Сотрудник {

String name ;
String address;
public Employee(String name, String address) {

    this.name = name;
    this.address = address;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAddress() {
    return address;
}
public void setAddress(String address) {
    this.address = address;
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((address == null) ? 0 : address.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee other = (Employee) obj;
    if (address == null) {
        if (other.address != null)
            return false;
    } else if (!address.equals(other.address))
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
}

}

открытый класс HashcodeEqualsTesting {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Map<String, Employee> mymap = new HashMap<>(); 
    Set<Employee> myset = new HashSet<>();

    Employee e1 = new Employee("Depak", "India");
    Employee e2 = new Employee("Depak", "India");

    myset.add(e1);
    myset.add(e2);
    System.out.println(myset.size()); // shows 1
    mymap.put("ABC", e1);
    mymap.put("XYZ", e2);
    System.out.println(mymap.size()); // why shows 2

}

}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это потому, что hashmap позволяет хранить повторяющиеся значения.

Вы пытаетесь сопоставить «ABC» с e1 и «XYZ» с e2.Даже если e1 равно e2, «ABC» отличается от «XYZ», и поэтому размер вашей карты равен двум (теперь ваша карта имеет ABC-> e1, XYZ-> e2).

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

mymap = insertIntoHashMap("ABC",e1,mymap);


public Hashmap<String,Employee> insertIntoHashMap(String key, Employee employee,Hashmap<String,Employee> mymap)
{
    boolean insert = true;
    for(String employeeKey : mymap.keySet())
    {
        if(mymap.get(employeeKey).equals(employee))
        {
            insert = false;
            break;
        }
    }
    if(insert)
    {
        mymap.put(key,employee);
    }
    return mymap;
}
0 голосов
/ 11 февраля 2019

Чтобы прояснить ваши сомнения, согласно вашей реализации оба объекта Employee, т. Е. E1 и e2, равны, поэтому они будут добавлены для установки только один раз.

Однако в HashMap вы добавляете twoотдельные ключи - ABC и XYZ, поэтому будет вычислен хэш-код ключей.(Не относится к классу сотрудников), поэтому размер вашей hashMap равен 2.

. Для более глубокого понимания внутренней работы HashMap вы можете обратиться по следующей ссылке - https://www.geeksforgeeks.org/internal-working-of-hashmap-java/

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