Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Store unique objects to avoid the duplicates in java Set?

How to Store unique objects to avoid the duplicates in java Set?

For example

Consider Employee object which (Employee Id, name, salary....)

list of employee of objects need to add in the Set. We need to restrict the Set for the duplicate elements which need to identify by the "Employee Id.

What are the best way's to do?

like image 272
iamjustcoder Avatar asked Oct 08 '12 07:10

iamjustcoder


People also ask

How does Set avoid duplicates in Java?

Each and every element in the set is unique . So that there is no duplicate element in set . Now , what happens internally when you pass duplicate elements in the add() method of the Set object , It will return false and do not add to the HashSet , as the element is already present .

How do you remove duplicates from a Set of objects in Java?

Set implementations in Java has only unique elements. Therefore, it can be used to remove duplicate elements. HashSet<Integer>set = new HashSet<Integer>(list1); List<Integer>list2 = new ArrayList<Integer>(set); Above, the list2 will now have only unique elements.

How do you add unique items to a HashSet in Java?

put(e,PRESENT) will return null, if element is not present in the map. So map. put(e, PRESENT) == null will return true, hence add method will return true and element will be added in HashSet.


2 Answers

If you are using an implementation of a java.util.Set, it should not allow duplicates as long as your equals and hashCode methods are implemented properly. Not sure why you have hashmap and hashtable as tags on your question though. Maybe you should rephrase your question and add the code that gives you issues?

Edit: considering your edit:

If you use a Set, your Employee should have the following methods:


    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((id == null) ? 0 : id.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 (id == null) {
          if (other.id != null)
            return false;
        } else if (!id.equals(other.id))
          return false;
        return true;
      }
like image 189
Dirk Avatar answered Oct 21 '22 00:10

Dirk


Similarly to @Dirk, you can also use HashCodeBuilder and EqualsBuilder from org.apache.commons.

It would look like this:

@Override
public int hashCode() {
    return new HashCodeBuilder()
            .append(id)
            .append(name)
            .append(salary)
            .toHashCode();
}

@Override
public boolean equals(Object obj) {
    if (obj instanceof Employee) {
        final Employee employee = (Employee) obj;

        return new EqualsBuilder()
                .append(id, employee.id)
                .append(name, employee.name)
                .append(salary, employee.salary)
                .isEquals();
    } else {
        return false;
    }
}
like image 24
hipokito Avatar answered Oct 20 '22 23:10

hipokito