如何通过检查名称age和rollno这三个条件来对通用列表进行排序

时间:2015-06-30 08:05:35

标签: java sorting

示例我的列表为:

rollno name age add
01      abc 12   abc  
02      pqr  13  srf

我想根据学生的名字对列表进行排序 如果名称相同,我必须根据年龄排序,如果年龄相同,我想根据滚动排序

public void sortData(List<Student> studentList) {
    Student s1=null;
    Student s2=null;
    // Comparator<Student> StuNameComparator = new Comparator<Student>(); 

    String StudentName1 = s1.getStudentName().toUpperCase();
    String StudentName2 = s2.getStudentName().toUpperCase();

    //ascending order
    System.out.println(StudentName1.compareTo(StudentName2));

    //descending order
    //return StudentName2.compareTo(StudentName1);
}

2 个答案:

答案 0 :(得分:1)

Java SE 8使这很简单,因为您可以定义3 Comparator并使用thenComparing方法之一链接它们。

例如,像这样:

studentList.sort(Comparator.comparing(Student::getName,String.CASE_INSENSITIVE_ORDER).
thenComparingInt(Student::getAge).
thenComparing(Student::getRollNo));

您可能需要更改学生等的方法名称。

答案 1 :(得分:0)

您已经提出了同样的问题Here。那不是回答你的问题吗? 在提问之前请先做一些搜索。并且您应该使用相同的问题来进一步查询与该问题相关的问题。

作为概述,您可以使用以下参考代码: -

/**
 * Adding students in ArrayList (rollNo, name, age)
 */
 ArrayList<Student> students = new ArrayList();
    Student s1 = new Student(1, "abc",12);
    Student s2 = new Student(2,"def", 14);
    Student s3 = new Student(3, "ghi", 15);
    students.add(s1);
    students.add(s2);
    students.add(s3);

    /**
     * Comparator by Name
     */
    public static Comparator<Student> getCompByName()
    {   
     Comparator comp = new Comparator<Student>(){
         @Override
         public int compare(Student s1, Student s2)
         {
             return s1.name.compareTo(s2.name);
         }        
     };
     return comp;
    }

    /**
     * Comparator by Age
     */
    public static Comparator<Student> getCompByAge()
    {   
     Comparator comp = new Comparator<Student>(){
         @Override
         public int compare(Student s1, Student s2)
         {
             return s1.age.compareTo(s2.age);
         }        
     };
     return comp;
    }

    /**
     * Comparator by Roll No.
     */
    public static Comparator<Student> getCompByRollNo()
    {   
     Comparator comp = new Comparator<Student>(){
         @Override
         public int compare(Student s1, Student s2)
         {
             return s1.rollNo.compareTo(s2.rollNo);
         }        
     };
     return comp;
    }

    /**
     * Comparison on basis of different criterias you can use
     */
    Collections.sort(students, Student.getCompByName());
    Collections.sort(students, Student.getCompByAge());
    Collections.sort(students, Student.getCompByRollNo());

为了检查每个比较器后List是否相同,您可以使用: -

listA.containsAll(listB) && listB.containsAll(listA)

或者您可以使用Apache Common Utils isEqualCollection()来比较2个列表,如: -

List<String> listA = Arrays.asList("a", "b", "b", "c");
List<String> listB = Arrays.asList("b", "c", "a", "b");
System.out.println(CollectionUtils.isEqualCollection(listA, listB)); // true

List<String> listC = Arrays.asList("a", "b", "c");
List<String> listD = Arrays.asList("a", "b", "c", "c");
System.out.println(CollectionUtils.isEqualCollection(listC, listD)); // false

您希望拥有的任何额外逻辑,在两者之间实现。