javacomparatorcomparable

Using Comparable for multiple dynamic fields of VO in Java


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?


Solution

  • 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());