• 技术文章 >Java >java教程

    Java线性表的排序

    黄舟黄舟2017-02-22 10:01:45原创1110
    Java线性表的排序

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

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


    方式一:Comparator比较器

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

    1.先定义一个模型:

    package model;
    
    /**
     * User.java
     * 
     * @author 梁WP 2014年3月3日
     */
    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;
    
    /**
     * ComparatorUser.java
     * 
     * @author 梁WP 2014年3月3日
     */
    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;
    
    /**
     * TestApp.java
     * 
     * @author 梁WP 2014年3月3日
     */
    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;
    
    /**
     * Student.java
     * 
     * @author 梁WP 2014年3月4日
     */
    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;
    
    /**
     * TestApp.java
     * 
     * @author 梁WP 2014年3月4日
     */
    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

    以上就是Java线性表的排序 的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:Java 实例 - 连接字符串 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Java数据结构之单链表与OJ题• 详细介绍Java正则表达式之单字符匹配和预定义字符• Java总结分享之反射、枚举、Lambda表达式• 实例详解Java顺序表和链表• 深入分析Java的序列化与反序列化
    1/1

    PHP中文网