Reputation: 33
I got lot of sort example in single value inside pojo class.
but i want to sort with multiple value look like below example
before sort
Name City Roll
--------------------------------------
sekhar ---------bbsr------------23
himanshu -------agra------------23
nitin ----------delhi------------23
nitin ----------delhi------------22
nitin ----------bbsr------------23
arun -----------patna------------23
arun -----------kendrapara-------23
after sort
Name City Roll
--------------------------------------
arun -------kendrapara------------23
arun -------patna------------23
himanshu ----agra------------23
nitin -------bbsr------------23
nitin -------delhi------------22
nitin -------delhi------------23
sekhar -------bbsr------------23
My code is here
package example;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo demo = new Demo();
List<Student> list = new ArrayList<Student>(); // your Car list
Student st = demo.new Student();
st.setName("sekhar");
st.setCity("bbsr");
st.setRoll(23);
list.add(st);
st = demo.new Student();
st.setName("himanshu");
st.setCity("agra");
st.setRoll(23);
list.add(st);
st = demo.new Student();
st.setName("nitin");
st.setCity("delhi");
st.setRoll(23);
list.add(st);
st = demo.new Student();
st.setName("nitin");
st.setCity("delhi");
st.setRoll(22);
list.add(st);
st = demo.new Student();
st.setName("nitin");
st.setCity("bbsr");
st.setRoll(23);
list.add(st);
st = demo.new Student();
st.setName("arun");
st.setCity("patna");
st.setRoll(23);
list.add(st);
st = demo.new Student();
st.setName("arun");
st.setCity("kendrapara");
st.setRoll(23);
list.add(st);
System.out.println("before sort");
System.out.println("Name:" + "-------------------" + "City...........roll");
for (Student st1 : list) {
System.out.println(st1.getName() + " --------------" + st1.getCity() + "------------" + st1.getRoll());
}
Collections.sort(list, demo.new CarHorsePowerComparator());
System.out.println("after sort");
System.out.println("Name:" + "-------------------" + "City...............roll");
for (Student st1 : list) {
System.out.println(st1.getName() + " --------------" + st1.getCity() + "------------" + st1.getRoll());
}
}
public class Student {
String name;
String city;
int roll;
public int getRoll() {
return roll;
}
public void setRoll(int roll) {
this.roll = roll;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class CarHorsePowerComparator implements Comparator<Student> {
public int compare(Student stu, Student stu1) {
int sort = (stu.getName() + stu.getCity() + stu.getRoll()).compareTo((stu1.getName() + stu1.getCity() + stu1.getRoll()));
return sort;
}
}
}
but i'am using custom comparator
class CarHorsePowerComparator implements Comparator<Student> {
public int compare(Student stu, Student stu1) {
int sort = (stu.getName() + stu.getCity() + stu.getRoll()).compareTo((stu1.getName() + stu1.getCity() + stu1.getRoll()));
return sort;
}
it's working for me but it's not right way. how to write this code in correct way Please suggest me.
int sort = (stu.getName() + stu.getCity() + stu.getRoll()).compareTo((stu1.getName() + stu1.getCity() + stu1.getRoll()));
Upvotes: 3
Views: 2023
Reputation: 22730
(stu.getName() + stu.getCity() + stu.getRoll()).compareTo((stu1.getName() + stu1.getCity() + stu1.getRoll()))
means you are contcatinating Name, City and Roll number and sorting on the resulting string.
You should decide the sorting priorities first and sort on the fields in that order. Looking at the expected result seems like you want to sort on name first then on city and lastly on roll.
class CarHorsePowerComparator implements Comparator<Student> {
public int compare(Student stu, Student stu1) {
int sort;
// Sort on Name first
sort = stu.getName().compareTo(stu1.getName);
if(sort == 0){
// If name is equal, sort on city
sort = stu.getCity().compareTo(stu1.getCity);
}
if(sort == 0){
// If name and city is equal, sort on Roll
sort = Integer.compare(stu.getRoll(),stu1.getRoll());
}
return sort;
}
}
Upvotes: 3
Reputation: 30875
When you are using the plus operator you create lots of new String objects. String should be used to store some data not for logic purpose.
You should not use the parameters names as stu
and stu1
, because is error prone. You can use me
and other
or left
and 'right'.
You do not need a class declaration as you will be reusing it. The annonymous is fine
private final static Comparator<Student> STUDENT_NAME_CITY_ROLL_COMPARATOR = new Comparator<Student> {
private final Collator collator = Collator.getInstance(); //Default local is taken.
public int compare(Student left, Student right) {
int result = collator.compare(left.getName(),right.getName());
if(result == 0) {
result = collator.compare(left.getCity(),right.getCity());
}
if(result == 0) {
result = Integer.compare(left.getRoll(), right.getRoll()); //JDK 7
//result = Double.compare(left.getRoll(), right.getRoll());
}
return result;
}
Note: That the implementation will throw an NPE when some of the elements are null.
Upvotes: 0
Reputation: 711
int sort = stu.getName().compareTo(stu1.getName());
if (sort == 0)
sort = stu.getCity().compareTo(stu1.getCity())
if (sort == 0)
...
return res;
The point is that you continue comparison only if current components are equal
Upvotes: 0