Simplest
way to convert List to set is pass the List instance to the Set
Constructor.
Ex:
Set
mySet = new HashSet<> (myList)
But
one thing to remember is, Set won't allow duplicates. Duplication is
identified by using in combination with equals and hashCode method.
If you don't override both the methods then duplicates store into the
set.
Ex:
Without overriding equals and hashCode
public class Employee{ String name; Integer id; Employee(int id, String name){ this.name = name; this.id = id; } @Override public String toString(){ return id +" " + name; } }
import java.util.*; public class ListToSet { public static void main(String args[]){ List<Employee> myList = new ArrayList<> (); Set<Employee> mySet; Employee e1 = new Employee(1, "Krishna"); Employee e2 = new Employee(2, "Arjun"); Employee e3 = new Employee(1, "Krishna"); myList.add(e1); myList.add(e2); myList.add(e3); mySet = new HashSet<> (myList); Iterator<Employee> iter = mySet.iterator(); while(iter.hasNext()){ System.out.println(iter.next()); } } }
Output
1 Krishna 1 Krishna 2 Arjun
As
you observe the output, Employee with id '1' and name 'Krishna'
stored twice in the set. To resolve the issue Employee class must
override hashCode and equals methods.
Ex:
Overriding equals and hashCode
import java.util.Objects; public class Employee{ String name; Integer id; Employee(int id, String name){ this.name = name; this.id = id; } @Override public String toString(){ return id +" " + name; } @Override public int hashCode() { int hash = 7; hash = 29 * hash + Objects.hashCode(this.name); hash = 29 * hash + Objects.hashCode(this.id); return hash; } @Override public boolean equals(Object obj){ if(obj!=null) if(obj instanceof Employee){ Employee emp = (Employee) obj; boolean a = Objects.equals(id, emp.id); boolean b = (name == null ? emp.name == null : name.equals(emp.name)); return ( a && b); } return false; } }
Run
ListToSet again, then no duplicates are stored to the Set.
Related
Links
No comments:
Post a Comment