Click here to watch in Youtube :
https://www.youtube.com/watch?v=pPIQIlLPVOo&list=UUhwKlOVR041tngjerWxVccw
DescendingEmployeeIdComparator.java
TreeMapExample.java
https://www.youtube.com/watch?v=pPIQIlLPVOo&list=UUhwKlOVR041tngjerWxVccw
DescendingEmployeeIdComparator.java
import java.util.Comparator; public class DescendingEmployeeIdComparator implements Comparator<Integer> { /* * This method used to arrange the employeeId's in descending order. */ @Override public int compare( Integer empId1, Integer empId2 ) { if( empId1 < empId2 ) { return 1; } else { return -1; } } }
import java.util.Comparator; import java.util.TreeMap; /* * Example of comparator() method. */ public class TreeMapExample { public static void main( String[] args ) { DescendingEmployeeIdComparator descendingEmployeeIdComparator
= new DescendingEmployeeIdComparator(); TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>( descendingEmployeeIdComparator); /* * Key is EmployeeId - Value is EmployeeName */ treeMap.put(20, "Balu"); treeMap.put(10, "Ajay"); treeMap.put(40, "Carol"); treeMap.put(30, "Dave"); System.out.println("treeMap : " + treeMap + "\n"); Comparator<?> comparator = treeMap.comparator(); System.out.println("Comparator name : "+comparator.getClass().getName()); } }
treeMap : {40=Carol, 30=Dave, 20=Balu, 10=Ajay} Comparator name : DescendingEmployeeIdComparator
https://sites.google.com/site/javaee4321/java-collections/TreeMapDemoComparator.zip?attredirects=0&d=1
See also:
I believe all of your examples of custom Comparator for data types are broken, because you never return 0 to mean objects are equal things will disappear in there and appear to not be in there when searched for! Additionally, every Comparator should return 0 whenever .equals() would to avoid elements seeming to disappear.
ReplyDeleteSee this code (sorry, top-level name stayed same as last example, but everything is TreeSet now). Other things are good but the Comparator is very flawed!
package badHashSet;
import java.util.TreeSet;
import java.util.Objects;
import java.util.Comparator;
class Employee {
private String name;
private int age;
private int salary;
public Employee(String name, int age, int salary)
{
super();
this.setName(name);
this.setAge(age);
this.setSalary(salary);
}
@Override
public int hashCode() {
return Objects.hash(age, name, salary);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Employee))
return false;
Employee other = (Employee) obj;
return age == other.age && Objects.equals(name, other.name) && salary == other.salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString()
{
return "Employee [name= " + name + ", age= " + age + ", salary= " + salary+"]";
}
}
class BadComparator implements Comparator
{
public int compare(Employee emp1, Employee emp2)
{
if (emp1.getAge()< emp2.getAge() ) return -1;
else return 1;
}
}
public class BadHashSet {
public static void main(String[] args) {
TreeSet employees = new TreeSet<>(new BadComparator());
Employee batman = new Employee("Batman", 80, 100_000);
Employee superman = new Employee("Superman", 83, 250_000);
Employee wonderWoman = new Employee("WonderWoman", 74, 160_000);
// note: I prefer to store year of birth which does not change rather
// than age which changes every year, but it helps show this problem!
employees.add( batman );
employees.add( superman );
employees.add( wonderWoman );
for( var emp : employees)
{
System.out.println(emp);
}
System.out.println("Who is in there now?");
System.out.println("Is batman?" + employees.contains(batman));
System.out.println("Is superman?" + employees.contains(superman));
System.out.println("Is wonder woman?" + employees.contains(wonderWoman));
System.out.println("They are all gone, we'd better re-add them!!");
employees.add(batman);
employees.add(superman);
employees.add(wonderWoman);
System.out.println("That was close!! Let's see if it worked?");
for( var emp : employees)
{
System.out.println(emp);
}
System.out.println("Who is in there now?");
System.out.println("Is batman?" + employees.contains(batman));
System.out.println("Is superman?" + employees.contains(superman));
System.out.println("Is wonder woman?" + employees.contains(wonderWoman));
System.out.println("Where did they all go? The BadComparator lost them!");
}
}