Java线性表的排序

Java线性表的排序

 

前言:刚才在弄JDBC的时候,忽然觉得order-by用太多了没新鲜感,我的第六感告诉我java有对线性表排序的封装,然后在eclipse里随便按了一下“.” ,哈哈,竟然真有这么一个静态方法public static <T> void sort(List<T> list, Comparator<? super T> c)。

修改记录:根据@mythabc的的建议,添加了另一种方式。

 

方式一:Comparator比较器

好处:这种方式运行的时候比较灵活,如果要更换排序规则,不更改原有的比较器,而直接新建另一个比较器,在客户端换一下比较器的新类名就行了,这样比较贴近开闭原则,当累积了多个比较器后,各种排序规则可以随意转换,挺爽的;模型与排序分离,比较贴近单一职责原则。

1.先定义一个模型:

package model;

public class User
{
    private String userName;
    private int userAge;
    
    public User()
    {
    }
    
    public User(String userName, int userAge)
    {
        this.userName = userName;
        this.userAge = userAge;
    }

    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String userName)
    {
        this.userName = userName;
    }

    public int getUserAge()
    {
        return userAge;
    }

    public void setUserAge(int userAge)
    {
        this.userAge = userAge;
    }
}

 

2.然后定义一个比较器,实现java.util.Comparator接口,在compare()方法编写比较规则:

package util;

import java.util.Comparator;

import model.User;

public class ComparatorUser implements Comparator<User>
{
    @Override
    public int compare(User arg0, User arg1)
    {
        // 先比较名字
        int flag = arg0.getUserName().compareTo(arg1.getUserName());
// 如果名字一样,就比较年龄 if (flag == 0) { return arg0.getUserAge() - arg1.getUserAge(); } return flag; } }

 

3.排序的时候用java.util.Collections里面的sort(List list, Comparator c)方法:

package test;

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

import util.ComparatorUser;
import model.User;

public class TestApp
{
    public static void main(String[] arg0)
    {
        List<User> userList = new ArrayList<User>();

        // 插入数据
        userList.add(new User("A", 15));
        userList.add(new User("B", 14));
        userList.add(new User("A", 14));

        // 排序
        Collections.sort(userList, new ComparatorUser());

        // 打印结果
        for (User u : userList)
        {
            System.out.println(u.getUserName() + " " + u.getUserAge());
        }
    }
}

 

4.运行结果:

A 14
A 15
B 14

 

方式二:实现Comparable接口

好处:直接让模型附带可排序的属性,不用去定义新的类(不用定义比较器),减少了类的数量,方便管理,阅读的时候比较轻松。

1.先定义一个模型,并实现Comparable接口,在compareTo()方法编写比较规则:

package model;

public class Student implements Comparable<Student>
{
    private String studentName;
    private int studentAge;

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

    public String getStudentName()
    {
        return studentName;
    }

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

    public int getStudentAge()
    {
        return studentAge;
    }

    public void setStudentAge(int studentAge)
    {
        this.studentAge = studentAge;
    }

    @Override
    public int compareTo(Student o)
    {
        // 先比较名字
        int flag = this.getStudentName().compareTo(o.getStudentName());

        // 如果名字一样,就比较年龄
        if (flag == 0)
        {
            return this.getStudentAge() - o.getStudentAge();
        }
        return flag;
    }
}

 

2.排序的时候用java.util.Collections里面的sort(List list)方法:

package test;

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

import model.Student;

public class TestApp2
{
    public static void main(String[] arg0)
    {
        List<Student> studentList = new ArrayList<Student>();

        // 插入数据
        studentList.add(new Student("A", 15));
        studentList.add(new Student("B", 14));
        studentList.add(new Student("A", 14));

        // 排序
        Collections.sort(studentList);

        // 打印结果
        for (Student s : studentList)
        {
            System.out.println(s.getStudentName() + " " + s.getStudentAge());
        }
    }
}

 

3.运行结果:

A 14
A 15
B 14

 

posted @ 2014-03-04 09:39  liangwp  阅读(1197)  评论(2编辑  收藏  举报