对List里的对象元素进行排序

        对List里的对象元素进行排序,有两种方法,第一个是实例化比较器,第二个是实现Comparable接口。

一.实例化比较器

Student.java

package com.bijian.study;

public class Student {
    
    private int studentId;
    private String studentName;
    private int age;

    public Student(int studentId, String studentName, int age) {
        this.studentId = studentId;
        this.studentName = studentName;
        this.age = age;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Main.java

package com.bijian.study;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * 实例化一个比较器
 */
public class Main {

    public static void main(String[] args) {
        
        Student stu1 = new Student(1, "zhangsan", 28);
        Student stu2 = new Student(2, "zhagnsan", 19);
        Student stu3 = new Student(3, "wangwu", 19);
        Student stu4 = new Student(4, "wangwu", 19);
        Student stu5 = new Student(5, "zhaoliu", 18);

        ArrayList<Student> list = new ArrayList<Student>();
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        list.add(stu4);
        list.add(stu5);
        
        Comparator<Student> comparator = new Comparator<Student>() {
            public int compare(Student s1, Student s2) {
                // 先排年龄
                if (s1.getAge() != s2.getAge()) {
                    return s1.getAge() - s2.getAge();
                } else if (!s1.getStudentName().equals(s2.getStudentName())) {
                    // 年龄相同则按姓名排序
                    return s1.getStudentName().compareTo(s2.getStudentName());
                } else {
                    // 姓名也相同则按学号排序
                    return s1.getStudentId() - s2.getStudentId();
                }
            }
        };
        
        //这里就会自动根据规则进行排序
        Collections.sort(list, comparator);
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println("年龄:" + stu.getAge() + "   姓名:" + stu.getStudentName() + "   学号:" + stu.getStudentId());
        }
    }
}

运行结果:

年龄:18   姓名:zhaoliu   学号:5
年龄:19   姓名:wangwu   学号:3
年龄:19   姓名:wangwu   学号:4
年龄:19   姓名:zhagnsan   学号:2
年龄:28   姓名:zhangsan   学号:1

二.实现Comparable接口

Student2.java

package com.bijian.study;

public class Student2 implements Comparable<Student2> {
    
    private int studentId;
    private String studentName;
    private int age;

    public Student2(int studentId, String studentName, int age) {
        this.studentId = studentId;
        this.studentName = studentName;
        this.age = age;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int compareTo(Student2 o) {
        if (age != o.getAge()) {
            return age - o.getAge();
        } else if (!studentName.equals(o.getStudentName())) {
            return studentName.compareTo(o.getStudentName());
        } else {
            return studentId - o.getStudentId();
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student2) {
            Student2 stu = (Student2) obj;
            if ((age == stu.getAge()) && (studentName.equals(stu.getStudentName()))
                    && (studentId == stu.getStudentId())) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}

Main2.java

package com.bijian.study;

import java.util.ArrayList;
import java.util.Collections;

/**
 * 实现Comparable接口
 */
public class Main2 {

    public static void main(String[] args) {
        
        Student2 stu1 = new Student2(1, "zhangsan", 28);
        Student2 stu2 = new Student2(2, "zhagnsan", 19);
        Student2 stu3 = new Student2(3, "wangwu", 19);
        Student2 stu4 = new Student2(4, "wangwu", 19);
        Student2 stu5 = new Student2(5, "zhaoliu", 18);

        ArrayList<Student2> list = new ArrayList<Student2>();
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        list.add(stu4);
        list.add(stu5);
        
        //这里就会自动根据规则进行排序
        Collections.sort(list);
        
        //输出查看结果
        for (int i = 0; i < list.size(); i++) {
            Student2 stu = list.get(i);
            System.out.println("年龄:" + stu.getAge() + "   姓名:" + stu.getStudentName() + "   学号:" + stu.getStudentId());
        }
    }
}

运行结果:

年龄:18   姓名:zhaoliu   学号:5
年龄:19   姓名:wangwu   学号:3
年龄:19   姓名:wangwu   学号:4
年龄:19   姓名:zhagnsan   学号:2
年龄:28   姓名:zhangsan   学号:1

        注:大家可以看下api文档里对接口 Comparable<T>接口的介绍,里面说是建议重写equals方法,否则可能出现怪异的表现。

文章来源:http://blog.csdn.net/ystyaoshengting/article/details/7448773

猜你喜欢

转载自bijian1013.iteye.com/blog/2291636