Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 438|回复: 0

[Java基础知识]用几行代码实现排序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 22:46:46 | 显示全部楼层 |阅读模式
    [原作]  

    摘要:经常看见有人还在不厌其烦的用冒泡(最常见!)或是交换做排序,实际上用几行代码就可以既快又好地实现排序, 不论是简单类型还是类,数组还是java集(Collection)。

    简单类型的排序

         简单类型不外是byte, char, short, int, long, float, double等数据类型, 这些类型不能放在集中,只能使用数组。 java.util.Arrays方法提供了对这些类型的sort方法(实际上还有很多其他有用的方法),下面是对一个简单的int数组排序:

            int[] arr = {2, 3, 1,10,7,4};  
      
       
       
       

       
      

       
            System.out.print("before sort: ");

            for (int i = 0; i< arr.length; i++)

                System.out.print(arr + " ");

            System.out.println();        

       

            Arrays.sort(arr);

            System.out.print("after sort: ");

            for (int i = 0; i< arr.length; i++)

                System.out.print(arr + " ");

            System.out.println();        

    输出结果:

    before sort: 2 3 1 10 7 4  

    after sort: 1 2 3 4 7 10

    我们看到排序结果是按照升序排列的,下面的排序都是如此。

       

    对象的排序

            对象可以放在数组里,同样调用Arrays.sort(Object[] arr)即可;也可以放到集里,用java.util.Collections的
    sort(List list)。
        但是这个类必须实现了java.lang.Comparable接口。这个接口只有一个方法:int compartTo(Object o),
    当本对象比传入的对象大时,返回一个正整数。 以类Programmer为例:

    class Programmer implements Comparable{

         private String name;

         private String language;

         private double pay;

         public Programmer(String name, String language, double pay) {

            this.name = name;

            this.language = language;

            this.pay = pay;

         }

       

         public int compareTo(Object o) {

            Programmer other = (Programmer)o;

            return (int)pay - (int)other.pay;

         }

       

         public String toString(){

            return "{name: " + name + ", language: " + language + ", money: " + pay + "}";

         }

    }

    对其进行排序:

            ArrayList list = new ArrayList();

            list.add(new Programmer("张三", "C", 12000));

            list.add(new Programmer("李四", "Java", 200));

            list.add(new Programmer("王五", "C++", 5000));

            list.add(new Programmer("钱六", "VB", 3000));

            System.out.println("before sort: " + list);

            Collections.sort(list);

            System.out.println("after sort: " + list);     

    输出:

    before sort: [{name: 张三, language: C, money: 12000.0}, {name: 李四, language: Java, money: 200.0},
      {name: 王五, language: C++, money: 5000.0}, {name: 钱六, language: VB, money: 3000.0}]

    after sort: [{name: 李四, language: Java, money: 200.0}, {name: 钱六, language: VB, money: 3000.0},  
    {name: 王五, language: C++, money: 5000.0}, {name: 张三, language: C, money: 12000.0}]

       

    够简单吧!查查Comparable的javadoc可以知道,有很多类已经实现了该接口,因此对这些类的排序几行代码就可以搞定。

    最近看C#发现其中用System.Array.sort对数组排序,适用于所有实现了IComparable接口的对象,看来微软的借鉴能力还真是强啊!

       

    对已有类进行排序

    上面的方法有一个问题,就是一个类已经存在了,并且没有实现Comparable接口,使用一个子类进行封装?
    很麻烦(你可以对下面的例子试试)。还有一种情况就是对一个类没法实现多种排序。以File类为例,它实现了Comparable接口,
    但是是按照名称排序的。如果要按照大小排序,或者按修改时间排序呢?对这两种情况,使用java.util包的Comparator接口:

    Arrays.sort(Object[] arr, Comparator com)

    Collections.sort(Object[] arr, Comparator com)

    Comparator接口的方法:

    public int compare(Object o1, Object o2) 当o1比o2大时返回一个正整数

    public boolean equals(Object obj)  判断obj与这个Comparator是否同一个对象

    下面使用Comparator对文件实现了按文件大小或修改时间排序:

    class FileUtils {

         static class CompratorByLastModified implements Comparator {

            public int compare(Object o1, Object o2) {

                File file1 = (File)o1;

                File file2 = (File)o2;

                long diff = file1.lastModified() - file2.lastModified();

                if (diff > 0)

                   return 1;

                else if (diff == 0)

                   return 0;

                else

                   return -1;

            }

             

            public boolean equals(Object obj){

                return true;  //简单做法

            }

         }

       

         static class CompratorBySize implements Comparator {

            public int compare(Object o1, Object o2) {

                File file1 = (File)o1;

                File file2 = (File)o2;

                long diff = file1.length() - file2.length();

                if (diff > 0)

                   return 1;

                else if (diff == 0)

                   return 0;

                else

                   return -1;

            }

             

            public boolean equals(Object obj){

                return true;  //简单做法

            }

         }

       

    }

    调用的示例:

            File dir = new File("C:\temp");

            File[] files = dir.listFiles();

       

            System.out.print("before sort: ");

            for (int i = 0; i< files.length; i++)

                System.out.print(files + " ");

            System.out.println();        

             

            Arrays.sort(files);

            System.out.print("sort by name: ");

            for (int i = 0; i< files.length; i++)

                System.out.print(files + " ");

            System.out.println();        

       

            Arrays.sort(files, new FileUtils.CompratorBySize());

            System.out.print("sort by size: ");

            for (int i = 0; i< files.length; i++)

                System.out.print(files + " ");

            System.out.println();        

       

            Arrays.sort(files, new FileUtils.CompratorByLastModified());

            System.out.print("sort by last modified: ");

            for (int i = 0; i< files.length; i++)

                System.out.print(files + " ");

            System.out.println();        

             

    自己找个目录试一下吧。用这些Java类库中的方法,一般情况下应该是不用自己写排序算法了吧?

       

    最后附上完整代码占点版面:
    import java.io.*;

    import java.util.*;
    public class TestSort {

         public static void main(String[] args) {

            sortSimpleType();

            sortComparable();

            sortComparator();

         }

          

         public static void sortSimpleType() {

            int[] arr = {2, 3, 1,10,7,4};

            System.out.print("before sort: ");

            for (int i = 0; i< arr.length; i++)

                System.out.print(arr + " ");

            System.out.println();        

            Arrays.sort(arr);

            System.out.print("after sort: ");

            for (int i = 0; i< arr.length; i++)

                System.out.print(arr + " ");

            System.out.println();        

         }

       

         public static void sortComparable() {

            ArrayList list = new ArrayList();

            list.add(new Programmer("张三", "C", 12000));

            list.add(new Programmer("李四", "Java", 200));

            list.add(new Programmer("王五", "C++", 5000));

            list.add(new Programmer("钱六", "VB", 3000));

            System.out.println("before sort: " + list);

            Collections.sort(list);

            System.out.println("after sort: " + list);     

         }

          

         public static void sortComparator() {

            File dir = new File("C:\java");

            File[] files = dir.listFiles();

       

            System.out.print("before sort: ");

            for (int i = 0; i< files.length; i++)

                System.out.println(files + " ");

            System.out.println();        

             

            Arrays.sort(files);

            System.out.print("sort by name: ");

            for (int i = 0; i< files.length; i++)

                System.out.println(files + " ");

            System.out.println();        

       

            Arrays.sort(files, new FileUtils.CompratorBySize());

            System.out.print("sort by size: ");

            for (int i = 0; i< files.length; i++)

                System.out.println(files + " ");

            System.out.println();        

       

            Arrays.sort(files, new FileUtils.CompratorByLastModified());

            System.out.print("sort by last modified: ");

            for (int i = 0; i< files.length; i++)

                System.out.println(files + " ");

            System.out.println();        

             

         }

    }

       

    class Programmer implements Comparable{

         private String name;

         private String language;

         private double pay;

          

         public Programmer(String name, String language, double pay) {

            this.name = name;

            this.language = language;

            this.pay = pay;

         }

       

         public int compareTo(Object o) {

            Programmer other = (Programmer)o;

            return (int)pay - (int)other.pay;

         }

       

         public String toString(){

            return "{name: " + name + ", language: " + language + ", money: " + pay + "}";

         }

    }

       

    class FileUtils {

         static class CompratorByLastModified implements Comparator {

            public int compare(Object o1, Object o2) {

                File file1 = (File)o1;

                File file2 = (File)o2;

                long diff = file1.lastModified() - file2.lastModified();

                if (diff > 0)

                   return 1;

                else if (diff == 0)

                   return 0;

                else

                   return -1;

            }

             

            public boolean equals(Object obj){

                return true;  //简单做法

            }

         }

       

         static class CompratorBySize implements Comparator {

            public int compare(Object o1, Object o2) {

                File file1 = (File)o1;

                File file2 = (File)o2;

                long diff = file1.length() - file2.length();

                if (diff > 0)

                   return 1;

                else if (diff == 0)

                   return 0;

                else

                   return -1;

            }

             

            public boolean equals(Object obj){

                return true;  //简单做法

            }

         }

    }
    运行结果:


    C:java>java   TestSort
    before sort: 2 3 1 10 7 4
    after sort: 1 2 3 4 7 10

    before sort: [{name: 张三, language: C, money: 12000.0}, {name: 李四, language:
    Java, money: 200.0}, {name: 王五, language: C++, money: 5000.0}, {name: 钱六, language: VB, money: 3000.0}]

    after sort: [{name: 李四, language: Java, money: 200.0}, {name: 钱六, language:
    VB, money: 3000.0}, {name: 王五, language: C++, money: 5000.0}, {name: 张三, language: C, money: 12000.0}]

    before sort: C:javaclass.bat
    C:javaonlyfun
    C:javauild.xml
    C:java1.txt
    C:java
    ative.bat
    C:javahib.bat
    C:javahjar
    C:javasrc
    C:javaxdoclet
    C:javalib2
    C:javajsf.bat
    C:javastruts.bat
    C:javaTestSort.java
    C:javaTestSort.class
    C:javajar
    C:javamessages_zh_TW1.properties
    C:javamessages.properties
    C:javamessages_zh_TW.properties
    C:javaProgrammer.class
    C:javaFileUtils$CompratorByLastModified.class
    C:javaFileUtils$CompratorBySize.class
    C:javaFileUtils.class
    C:javalib
    C:javaean.xml

    sort by name: C:java1.txt
    C:javaean.xml
    C:javauild.xml
    C:javaclass.bat
    C:javaFileUtils$CompratorByLastModified.class
    C:javaFileUtils$CompratorBySize.class
    C:javaFileUtils.class
    C:javahib.bat
    C:javahjar
    C:javajar
    C:javajsf.bat
    C:javalib
    C:javalib2
    C:javamessages.properties
    C:javamessages_zh_TW.properties
    C:javamessages_zh_TW1.properties
    C:java
    ative.bat
    C:javaonlyfun
    C:javaProgrammer.class
    C:javasrc
    C:javastruts.bat
    C:javaTestSort.class
    C:javaTestSort.java
    C:javaxdoclet

    sort by size: C:javahjar
    C:javajar
    C:javalib
    C:javalib2
    C:javaonlyfun
    C:javasrc
    C:javaxdoclet
    C:java1.txt
    C:java
    ative.bat
    C:javajsf.bat
    C:javastruts.bat
    C:javaclass.bat
    C:javaFileUtils.class
    C:javahib.bat
    C:javamessages.properties
    C:javaFileUtils$CompratorBySize.class
    C:javaFileUtils$CompratorByLastModified.class
    C:javaean.xml
    C:javaProgrammer.class
    C:javamessages_zh_TW.properties
    C:javamessages_zh_TW1.properties
    C:javauild.xml
    C:javaTestSort.class
    C:javaTestSort.java

    sort by last modified: C:javalib
    C:javajar
    C:javahjar
    C:javaonlyfun
    C:java1.txt
    C:javahib.bat
    C:javasrc
    C:javaxdoclet
    C:javauild.xml
    C:javalib2
    C:javaean.xml
    C:javaclass.bat
    C:javastruts.bat
    C:javamessages.properties
    C:javamessages_zh_TW1.properties
    C:javamessages_zh_TW.properties
    C:javajsf.bat
    C:java
    ative.bat
    C:javaTestSort.java
    C:javaFileUtils.class
    C:javaFileUtils$CompratorBySize.class
    C:javaFileUtils$CompratorByLastModified.class
    C:javaProgrammer.class
    C:javaTestSort.class


    C:java>
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-12 22:23 , Processed in 0.360382 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表