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