Sorting Of a list multiple attribute wise two technique

Sorting Of a list multiple attribute wise two technique
First is multiple Class wise sorting
Collections.sort(list, new EmployeeChainedComparator(
new NameComparator(),
                new EmployeeAgeComparator(),
                new EmployeeSalaryComparator()
                )
        );
Second is Single class wise sorting
Collections.sort(list, new Comparator<Object>() {
public int compare(Object obj1, Object obj2) {
Employee e1 = (Employee) obj1;
Employee e2 = (Employee) obj2;
int name = e1.getName().compareTo(e2.getName()); 
Integer ooo1 = new Integer(String.valueOf(e1.getAge()));
Integer ooo2 = new Integer(String.valueOf(e2.getAge()));
int age =  ooo1.compareTo(ooo2);
int sal = Double.compare(e1.getSalary(), e2.getSalary()); 
        if (name != 0) {  
            return name;  
        }else if(name ==0 && age!=0){
         return age;
        }else if(name ==0 && age==0 && sal!=0){
         return sal;
        }
        
return name;
}
});

Step 1>
package com.kartik.sorting.compare;

public class Employee {
private String name;
private int age;
private double salary;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the salary
*/
public double getSalary() {
return salary;
}
/**
* @param salary the salary to set
*/
public void setSalary(double salary) {
this.salary = salary;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
long temp;
temp = Double.doubleToLongBits(salary);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@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 (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Double.doubleToLongBits(salary) != Double
.doubleToLongBits(other.salary))
return false;
return true;
}

}


Step 2>
package com.kartik.sorting.compare;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class EmployeeSorting {

public static void main(String[] args) {

List<Employee> list=new ArrayList<Employee>();
Employee emp=new Employee();
emp.setName("kartik");
emp.setAge(25);
emp.setSalary(1000);
list.add(emp);
Employee emp2=new Employee();
emp2.setName("kartik");
emp2.setAge(24);
emp2.setSalary(5000);
list.add(emp2);
Employee emp3=new Employee();
emp3.setName("kartik");
emp3.setAge(25);
emp3.setSalary(5000);
list.add(emp3);
Employee emp4=new Employee();
emp4.setName("Hari");
emp4.setAge(25);
emp4.setSalary(1000);
list.add(emp4);
Employee emp5=new Employee();
emp5.setName("Hari");
emp5.setAge(20);
emp5.setSalary(2000);
list.add(emp5);
Employee emp6=new Employee();
emp6.setName("Hari");
emp6.setAge(25);
emp6.setSalary(500);
list.add(emp6);
Employee emp7=new Employee();
emp7.setName("Gopi");
emp7.setAge(25);
emp7.setSalary(500);
list.add(emp7);
Collections.sort(list, new EmployeeChainedComparator(
new NameComparator(),
                new EmployeeAgeComparator(),
                new EmployeeSalaryComparator()
                )
        );
System.out.println("Kartik many Class Design wise sorting");
for (Employee employee : list) {
System.out.println(employee.getName()+"---"+employee.getAge()+"---"+employee.getSalary());
}
System.out.println("Kartik Single Class Design wise sorting");
Collections.sort(list, new Comparator<Object>() {
public int compare(Object obj1, Object obj2) {
Employee e1 = (Employee) obj1;
Employee e2 = (Employee) obj2;
int name = e1.getName().compareTo(e2.getName()); 
Integer ooo1 = new Integer(String.valueOf(e1.getAge()));
Integer ooo2 = new Integer(String.valueOf(e2.getAge()));
int age =  ooo1.compareTo(ooo2);
int sal = Double.compare(e1.getSalary(), e2.getSalary()); 
       if (name != 0) {  
           return name;  
       }else if(name ==0 && age!=0){
        return age;
       }else if(name ==0 && age==0 && sal!=0){
        return sal;
       }
       
return name;
}
});
for (Employee employee : list) {
System.out.println(employee.getName()+"---"+employee.getAge()+"---"+employee.getSalary());
}
}

}


Step 3>
package com.kartik.sorting.compare;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
/**
 * This is a chained comparator that is used to sort a list by multiple
 * attributes by chaining a sequence of comparators of individual fields
 * together.
 *
 */
public class EmployeeChainedComparator implements Comparator<Employee> {
 
    private List<Comparator<Employee>> listComparators;
 
    @SafeVarargs
    public EmployeeChainedComparator(Comparator<Employee>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }
 
    @Override
    public int compare(Employee emp1, Employee emp2) {
        for (Comparator<Employee> comparator : listComparators) {
            int result = comparator.compare(emp1, emp2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}


Step 4>
package com.kartik.sorting.compare;

import java.util.Comparator;

public class NameComparator implements Comparator<Employee> {

@Override
public int compare(Employee arg0, Employee arg1) {
return arg0.getName().compareTo(arg1.getName());
}
}


Step 5>
package com.kartik.sorting.compare;

import java.util.Comparator;

/**
 * This comparator compares two employees by their ages.
 *
 */
public class EmployeeAgeComparator implements Comparator<Employee> {
 
    @Override
    public int compare(Employee emp1, Employee emp2) {
        return emp1.getAge() - emp2.getAge();
    }
}

Step 6>
package com.kartik.sorting.compare;

import java.util.Comparator;

/**
 * This comparator compares two employees by their salaries.
 * @author www.codejava.net
 *
 */
public class EmployeeSalaryComparator implements Comparator<Employee> {
 
    @Override
    public int compare(Employee emp1, Employee emp2) {
    int retval = Double.compare(emp1.getSalary(), emp2.getSalary());
    return retval;
    }
}

Out Put:

Kartik many Class Design wise sorting
Gopi---25---500.0
Hari---20---2000.0
Hari---25---500.0
Hari---25---1000.0
kartik---24---5000.0
kartik---25---1000.0
kartik---25---5000.0
Kartik Single Class Design wise sorting
Gopi---25---500.0
Hari---20---2000.0
Hari---25---500.0
Hari---25---1000.0
kartik---24---5000.0
kartik---25---1000.0
kartik---25---5000.0
Previous
Next Post »