关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java集合和数组的排序方式整理

    Java集合和数组的排序方式整理

    2014-12-15 00:00:00 出处:InfoQ - 廖雪峰
    分享

    根据约定,在使用java编程的时候应尽可能的使用现有的类库,当然你也可以自己编写一个排序的方法,或者框架,但是有几个人能写得比JDK里的还要好呢?使用现有的类的另一个好处是代码易于阅读和维护,这篇文章主要讲的是如何使用现有的类库对数组和各种Collection容器进行排序,(文章中的一 部分例子来自《Java Developers Almanac 1.4》)

    首先要知道两个类:java.util.Arrays和java.util.Collections(注意和Collection的区 别)Collection是集合框架的顶层接口,而Collections是包含了许多静态方法。我们使用Arrays对数组进行排序,使用 Collections对结合框架容器进行排序,如ArraysList,LinkedList等。

    例子中都要加上import java.util.*和其他外壳代码,如类和静态main方法,我会在第一个例子里写出全部代码,接下来会无一例外的省略。

    对数组进行排序

    比如有一个整型数组:

    int[] intArray = new int[] {4, 1, 3, -23};

    我们如何进行排序呢?你这个时候是否在想快速排序的算法?看看下面的实现方法:

    import java.util.*;  
    public class Sort{  
        public static void main(String[] args){  
            int[] intArray = new int[] {4, 1, 3, -23};  
            Arrays.sort(intArray);  
        }  
    }

    这样我们就用Arrays的静态方法sort()对intArray进行了升序排序,现在数组已经变成了{-23,1,3,4}.

    如果是字符数组:

    String[] strArray = new String[] {"z", "a", "C"};

    我们用:

    Arrays.sort(strArray);

    进行排序后的结果是{C,a,z},sort()会根据元素的自然顺序进行升序排序。如果希望对大小写不敏感的话可以这样写:

    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);

    当然我们也可以指定数组的某一段进行排序比如我们要对数组下表0-2的部分(假设数组长度大于3)进行排序,其他部分保持不变,我们可以使用:

    Arrays.sort(strArray,0,2);

    这样,我们只对前三个元素进行了排序,而不会影响到后面的部分。

    当然有人会想,我怎样进行降序排序?在众多的sort方法中有一个

    sort(T[] a, Comparator<  super T> c)

    我们使用Comparator获取一个反序的比较器即可,Comparator会在稍后讲解,以前面的intArray[]为例:

    Arrays.sort(intArray,Comparator.reverseOrder());

    这样,我们得到的结果就是{4,3,1,-23}。如果不想修改原有代码我们也可以使用:

    Collections.reverse(Arrays.asList(intArray));

    得到该数组的反序。结果同样为4,3,1,-23}。

    现在的情况变了,我们的数组里不再是基本数据类型(primtive type)或者String类型的数组,而是对象数组。这个数组的自然顺序是未知的,因此我们需要为该类实现Comparable接口,比如我们有一个Name类:

    class Name implements Comparable<Name>{  
        public String firstName,lastName;  
        public Name(String firstName,String lastName){  
            this.firstName=firstName;  
            this.lastName=lastName;  
        }  
        public int compareTo(Name o) {          //实现接口  
            int lastCmp=lastName.compareTo(o.lastName);  
            return (lastCmp!=0 lastCmp:firstName.compareTo(o.firstName));  
        }      
        public String toString(){                //便于输出测试  
            return firstName+" "+lastName;  
        }  
    }

    这样,当我们对这个对象数组进行排序时,就会先比较lastName,然后比较firstName 然后得出两个对象的先后顺序,就像compareTo(Name o)里实现的那样。不妨用程序试一试:

    import java.util.*;  
     public class NameSort {  
         public static void main(String[] args) {  
             Name nameArray[] = {  
                new Name("John", "Lennon"),  
                new Name("Karl", "Marx"),  
                new Name("Groucho", "Marx"),  
                new Name("Oscar", "Grouch")  
            };[page]  
            Arrays.sort(nameArray);  
            for(int i=0;i<nameArray.length;i++){  
                System.out.println(nameArray[i].toString());  
            }  
        }  
    }

    结果正如我们所愿:

    Oscar Grouch  
    John Lennon  
    Groucho Marx  
    Karl Marx

    对集合框架进行排序

    如果已经理解了Arrays.sort()对数组进行排序的话,集合框架的使用也是大同小异。只是将Arrays替换成了Collections,注意Collections是一个类而Collection是一个接口,虽然只差一个”s”但是它们的含义却完全不同。

    假如有这样一个链表:

    LinkedList list=new LinkedList();  
    list.add(4);  
    list.add(34);  
    list.add(22);  
    list.add(2);

    我们只需要使用:

    Collections.sort(list);

    就可以将ll里的元素按从小到大的顺序进行排序,结果就成了:

    [2, 4, 22, 34]

    如果LinkedList里面的元素是String,同样会想基本数据类型一样从小到大排序。

    如果要实现反序排序也就是从达到小排序:

    Collections.sort(list,Collectons.reverseOrder());

    如果LinkedList里面的元素是自定义的对象,可以像上面的Name对象一样实现Comparable接口,就可以让Collection.sort()为您排序了。

    如果你想按照自己的想法对一个对象进行排序,你可以使用

    sort(List<T> list, Comparator<  super T> c)

    这个方法进行排序,在给出例子之前,先要说明一下Comparator的使用,Comparable接口的格式:

    public interface Comparator<T> {  
        int compare(T o1, T o2);  
    }

    其实Comparator里的int compare(T o1,T o2)的写法和Comparable里的compareTo()方法的写法差不多。在上面的Name类中我们的比较是从LastName开始的,这是西方 人的习惯,到了中国,我们想从fristName开始比较,又不想修改原来的代码,这个时候,Comparator就可以派上用场了:

    final Comparator<Name> FIRST_NAME_ORDER=new Comparator<Name>() {  
        public int compare(Name n1, Name n2) {  
             int firstCmp=n1.firstName.compareTo(n2.firstName);  
             return (firstCmp!=0 firstCmp:n1.lastName.compareTo   
                     (n2.firstName));  
        }  
    };

    这样一个我们自定义的Comparator FIRST_NAME_ORDER就写好了。

    将上个例子里那个名字数组转化为List:

    List<Name> list=Arrays.asList(nameArray);  
    Collections.sort(list,FIRST_NAME_ORDER);

    这样我们就成功的使用自己定义的比较器设定排序。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。