I have a class that represents a Value Object (VO):
public class StudentVO {
int age;
String name;
}
I used the same class in two different areas. At one place I need to sort based on the age. In another place I need to sort based on the name, and in another place I may need sorting based on both age and name.
How can I do this?
If for one field I can override compareTo()
, is it possible to do this for other fields too?
1)You should write two Comparator for sorting on age and name separately, and then use the Collections.sort(List,Comparator). Something like this:
class StudentVO {
private String name;
private int age;
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;
}
}
class AgeComparator implements Comparator<StudentVO> {
@Override
public int compare(StudentVO o1, StudentVO o2) {
Integer age1 = o1.getAge();
Integer age2 = o2.getAge();
return age1.compareTo(age2);
}
}
class NameComparator implements Comparator<StudentVO> {
@Override
public int compare(StudentVO o1, StudentVO o2) {
return o1.getName().compareTo(o2.getName());
}
}
And then use them, To sort based on age
:
Collections.sort(list,new AgeComparator());
to sort based on name
:
Collections.sort(list,new NameComparator());
2) If you think that the List
of StudentVO
has some natural order of sorting, say suppose sort by age
. Then, use Comparable for age
and Comparator
for name
.
class StudentVO implements Comparable<StudentVO>{
private String name;
private int age;
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;
}
@Override
public int compareTo(StudentVO o) {
return ((Integer)getAge()).compareTo(o.getAge());
}
}
class NameComparator implements Comparator<StudentVO> {
@Override
public int compare(StudentVO o1, StudentVO o2) {
return o1.getName().compareTo(o2.getName());
}
}
And then use them, To sort based on age
:
Collections.sort(list);
to sort based on name
:
Collections.sort(list,new NameComparator());