Multiple Field Sorting using Comparator
Table of Contents
Multiple Field Sorting using Comparator:
Comparator is an interface used to perform custom sorting in java. Comparator can also be used to perform multiple field/sequences sorting in java.
Inorder to use comparator to perform custom sorting,
We need to create a class with Comparator interface implementation, then we need to override and provide the custom sorting logics in the compare(Object obj1, Object obj2) method.
Sample Syntax:
[java]
package in.javadomain;
import java.util.Comparator;
public class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return 0;
}
}
[/java]
Then we need to call the above comparator like this in Collections.sort(),
[java]
Collections.sort(ARRAYLIST_OR_SET_OR_ANY_COLLECTION,new MyComparator());
[/java]
Now we are going to do multiple field sorting for Mobile POJO.
MobilePoJo is a POJO class with mobile_price, mobile_model and memory_card_size.
Our Custom Sorting Logic:
1. Mobiles should be sorted based on price in ascending order.
2. If two/more than two mobiles prices are same, then it should sort based on memory_card_size in descending order.
MobilePOJO.java: [POJO Class]
[java]
package in.javadomain;
/**
* @author Naveen kumar Gunasekaran
* Site : Javadomain.in
*
*/
public class MobilePOJO {
String mobileModel;
int mobilePrice;
int memorySizeinGb;
public int getMemorySizeinGb() {
return memorySizeinGb;
}
public void setMemorySizeinGb(int memorySizeinGb) {
this.memorySizeinGb = memorySizeinGb;
}
public String getMobileModel() {
return mobileModel;
}
public void setMobileModel(String mobileModel) {
this.mobileModel = mobileModel;
}
public int getMobilePrice() {
return mobilePrice;
}
public void setMobilePrice(int mobilePrice) {
this.mobilePrice = mobilePrice;
}
}
[/java]
MultipleSeqSortingExample.java [Main Class]
[java]
package in.javadomain;
import java.util.ArrayList;
import java.util.Collections;
/**
* @author Naveen kumar Gunasekaran
* Site : Javadomain.in
*
*/
public class MultipleSeqSortingExample {
public static void main(String[] args) {
MobilePOJO mp = new MobilePOJO();
ArrayList<MobilePOJO> mobileArrayLst = new ArrayList<MobilePOJO>();
mp.setMobileModel(“Nokia 105”);
mp.setMobilePrice(1500);
mp.setMemorySizeinGb(16);
mobileArrayLst.add(mp);
mp = new MobilePOJO();
mp.setMobileModel(“Nokia 108”);
mp.setMobilePrice(1700);
mp.setMemorySizeinGb(32);
mobileArrayLst.add(mp);
mp = new MobilePOJO();
mp.setMobileModel(“Nokia 130”);
mp.setMobilePrice(1500);
mp.setMemorySizeinGb(32);
mobileArrayLst.add(mp);
mp = new MobilePOJO();
mp.setMobileModel(“Nokia 104”);
mp.setMobilePrice(1700);
mp.setMemorySizeinGb(8);
mobileArrayLst.add(mp);
mp = new MobilePOJO();
mp.setMobileModel(“Nokia 103”);
mp.setMobilePrice(2000);
mp.setMemorySizeinGb(64);
mobileArrayLst.add(mp);
mp = new MobilePOJO();
mp.setMobileModel(“Nokia 109”);
mp.setMobilePrice(1600);
mp.setMemorySizeinGb(64);
mobileArrayLst.add(mp);
System.out.println(“Before Sorting \n”);
for (MobilePOJO mobilePOJO : mobileArrayLst) {
System.out.println(mobilePOJO.getMobileModel() + ” | Rs. ” + mobilePOJO.getMobilePrice()
+ ” | Memory card Size : ” + mobilePOJO.getMemorySizeinGb());
}
System.out.println(“\n——————————————————“);
Collections.sort(mobileArrayLst, new MultipleSortingSequenceComparator());
Collections.sort(mobileArrayLst, new MyComparator());
System.out.println(
“\nAfter Sorting [First it will sort based on price(ascending order) then it will sort based on Memory card Size(descending order)] \n”);
for (MobilePOJO mobilePOJO : mobileArrayLst) {
System.out.println(mobilePOJO.getMobileModel() + ” | Rs. ” + mobilePOJO.getMobilePrice()
+ ” | Memory card Size : ” + mobilePOJO.getMemorySizeinGb());
}
}
}
[/java]
MultipleSortingSequenceComparator.java [Comparator for our custom sorting]
[java]
package in.javadomain;
import java.util.Comparator;
/**
* @author Naveen kumar Gunasekaran
* Site : Javadomain.in
*
*/
public class MultipleSortingSequenceComparator implements Comparator<MobilePOJO> {
@Override
public int compare(MobilePOJO o1, MobilePOJO o2) {
if (o1.getMobilePrice() > o2.getMobilePrice()) {
return 1;
} else if (o1.getMobilePrice() < o2.getMobilePrice()) {
return -1;
}
if (o1.getMemorySizeinGb() > o2.getMemorySizeinGb()) {
return -1;
} else if (o1.getMemorySizeinGb() < o2.getMemorySizeinGb()) {
return 1;
} else {
return 0;
}
}
}
[/java]
Output:
[plain]
Before Sorting
Nokia 105 | Rs. 1500 | Memory card Size : 16
Nokia 108 | Rs. 1700 | Memory card Size : 32
Nokia 130 | Rs. 1500 | Memory card Size : 32
Nokia 104 | Rs. 1700 | Memory card Size : 8
Nokia 103 | Rs. 2000 | Memory card Size : 64
Nokia 109 | Rs. 1600 | Memory card Size : 64
——————————————————
After Sorting [First it will sort based on price(ascending order) then it will sort based on Memory card Size(descending order)]
Nokia 130 | Rs. 1500 | Memory card Size : 32
Nokia 105 | Rs. 1500 | Memory card Size : 16
Nokia 109 | Rs. 1600 | Memory card Size : 64
Nokia 108 | Rs. 1700 | Memory card Size : 32
Nokia 104 | Rs. 1700 | Memory card Size : 8
Nokia 103 | Rs. 2000 | Memory card Size : 64
[/plain]
If you see the output, first mobiles are sorted based on the price.
Since two mobiles prices are same [1500 & 1700], it sorts results based on memory card size in descending order].
Hope you are clear with Multiple Field Sorting using comparator.
Feel free to post your comments/suggestions/feedbacks in the below comments section.