Java集合和数组的排序方式总结

来源:互联网 发布:linux 看文件权限 编辑:程序博客网 时间:2024/06/06 09:00

根据约定,在使用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);

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机设置越南文怎么办 电脑没有dvd驱动器怎么办 w7副本不是正版怎么办 win7硬盘速度慢怎么办 光盘装不了系统怎么办 winxp忘记开机密码怎么办 上班心里压力大怎么办 应聘人事没经验怎么办 有了撤药综合症怎么办 贯籍填写错误怎么办 没有想法的人怎么办 蜜蜂越来越少怎么办呢 眯眼睛了怎么办教案 小孩迷眼睛了怎么办 英语怎么办怎么搜题 倒车影像出现cam怎么办 贷款没有固定电话怎么办 公司要调动工作怎么办 不去厂里上班怎么办 我该怎么办英文怎么说 丝质裙子勾丝怎么办 饵料没有拉丝粉怎么办 被辞退了社保怎么办 发现工作不适合自己怎么办 找不到合适的工作怎么办 试用期不想干了怎么办 因为腰疼想调换工作怎么办 笔记本电脑开机出现英文怎么办 ios描述文件失效怎么办 pra抗体一类高怎么办 字段不能为null怎么办 电脑串口被占用怎么办 该卡未初始化怎么办 约好面试去不了怎么办 公司网速被限制怎么办 工地包工头欠钱怎么办 班里有人带钱丢了怎么办? 平安fna降到na怎么办 win10内存占用率过高怎么办 服务员站累了怎么办 会计证书掉了怎么办