`

Arrays和Collections的sort方法

 
阅读更多

对象排序之Comparator,Comparable接口区别:

comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合 collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像C++ STL中的函数对象一样。

  前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。

  一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。

  而Comparator的作用有两个:

  1,如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序

  2,为了使用不同的排序标准做准备,比如:升序、降序或其他什么序

 

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

对数组进行排序

对基本数据类型(primitive type)String类型的数组进行排序

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

    Arrays.sort(intArray);

    // [-23, 1, 3, 4]

  

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

    Arrays.sort(strArray);

    // [C, a, z]

  

    // Case-insensitive sort

    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);

    // [a, C, z]

  

    // Reverse-order sort

    Arrays.sort(strArray, Collections.reverseOrder());

    // [z, a, C]

  

    // Case-insensitive reverse-order sort

    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);

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

    // [z, C, a]

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

    Arrays.sort(strArray,0,2);

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

对对象数组进行排序

这个数组的自然顺序是未知的,因此我们需要为该类实现Comparable接口

Name

public 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)里实现的那样

用程序进行测试

NameSort

import java.util.*;

public class NameSort {

 public static void main(String[] args) {

  // TODO Auto-generated method stub

   Name[] nameArray = new Name[]{

                new Name("John", "Lennon"),

                new Name("Karl", "Marx"),

                new Name("Groucho", "Marx"),

                new Name("Oscar", "Grouch")

            };

            Arrays.sort(nameArray);

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

                System.out.println(nameArray[i].toString());

            }

 }

}

对集合框架进行排序

如果已经理解了Arrays.sort()对数组进行排序的话,集合框架的使用也是大同小异。只是将Arrays替换成了Collections,注意Collections是一个类而Collection是一个接口.

假如有这样一个链表:

    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)这个方法进行排序,

FIRST_NAME_ORDER

import java.util.*;

public class FIRST_NAME_ORDER implements 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));

 }

}

在上面的NameSort中将 Arrays.sort(nameArray);替换成下面语句

List<Name> list=Arrays.asList(nameArray); //将名字数组转化为List

Collections.sort(list,new FIRST_NAME_ORDER());

 

 

下面举例根据TreeMapkey进行降序排序

import java.util.*;

public class DescMap implements Comparator<String>{

    

    public int compare(String   o1,   String  o2)

    {

         int   map1   =   Integer.parseInt(o1);   

         int   map2   =   Integer.parseInt(o2);   

         return   map2-map1;   

    }

    

    public static void main(String[] args)

    {

        String[]   arraySources   =   {"1","2","3","0"};   

          int[]   arrayValue   =   {1,424,32,123};   

          Map   mapCurrentWebSite   =   new   TreeMap(new  DescMap());   

                  

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

          {   

            mapCurrentWebSite.put(arraySources[i],new  Integer(arrayValue[i]));   

          }   

                   

          Collection   col   =   mapCurrentWebSite.values();   

          Vector   v1   =   new   Vector(col);   

          for(int   i=0;i<v1.size();i++)   

              System.out.println((Integer)v1.get(i));         

    }

}

分享到:
评论

相关推荐

    Java Arrays.sort和Collections.sort排序实现原理解析

    主要介绍了Java Arrays.sort和Collections.sort排序实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java各种功能集合和工具.rar

    Arrays.sort(int[] a, int fromIndex, int toIndex) 并行排序:JDK1.8新增 Arrays.parallelSort(int[] a) Arrays.parallelSort(int[] a, int fromIndex, int toIndex) 并行计算: JDK1.8新增 支持函数式编程 根据...

    Collections集合工具类排序.docx

    数组有工具类Arrays,集合也有一个工具类Collections,这里练习一下集合工具类的排序方法,顺便过一下sort排序方法,比较器。 sort方法 sort(List&lt;T&gt; list):根据其元素的natural ordering对指定的列表进行排序。 ...

    java面试.rar

    List 和 Set 的区别,final finally finalize,Java获取反射的三种方法,Arrays.sort 和 Collections.sort 实现原理 和区别

    java-server-interview-questions:java服务端面试题整理

    答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSort实现的。TimSort算法就是找到已经排好序数据的子序列,然后对剩余部分排序,然后合并起来. foreach和while的区别(编译之后) 线程池的种类...

    Java对象排序、中文排序、SortedSet排序使用和源码讲解

    但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,java不希望这样,所以排序大多可以由java帮你做掉,例如,你要对一个数组排序,通过:Collections.sort(list)那么这个list被排序了...

    java常用工具类的使用

    该类的大部分构造器和方法都已经过时,但是该类使用非常方便,因此目前使用还很普遍,该类的另一个主要功能是,在数据库操作中,它允许将毫秒值表示为SQL DATE值,是数据库操作中java.sql.Date的父类。关于数据库...

    关于列表有用的一些方法.pptx

    3.如果列表中的元素是可比较大小的,则可用Java.util.Collections类中的静态方法sort(列表)方法进行排序 Collections.sort(list); System.out.println(list); ;4.求最大最小值 Collections类中的静态方法max(列表)...

    java中的排序.ppt

    Java 中的 Arrays 类提供了对这些类型的 sort 方法,可以用来对简单类型的数组进行排序。例如: ```java int[] arr = {2, 3, 1, 10, 7, 4}; System.out.print("before sort: "); for (int i = 0; i ; i++) System....

    java,Comparable接口实例

    实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然...

    javascript函数库-集合框架

    Classes: Collections Arrays ArrayList SortedList extends ArrayList HashMap HashSet */ /**************** Collections NOTE:sort() return a new List ****************/ function Collections(){} ...

    Everyday Data Structures

    Unleash the power of different sorting techniques such as bubble sort, quick sort, merge sort, insertion sort, and radix sort Perform searching operations on arrays, heaps, graphs, and binary trees in...

    最大重叠区间个数–java实现

    主要思路来源于下面这个博客: ...在细节上,做了一些修改: (1)定义了新的Comparator接口,使之能正确针对左...(5)原文中Collections.sort()修改为Arrays.sort() 代码实现: import java.util.Arrays; import java.

    Comparable接口和Comparator接口的比较

    实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。 此 接口只有一个方法...

    java抢票软件源码-interview:java面试题整理

    Collections.sort算法调用的是合并排序。 Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法,对象数组使用归并排序。 String,StringBuffer和StringBuilder的区别; 解答: Object的方法有哪些:比如有...

    程序员需要经常刷题吗-simple-java-zh-CN:SimpleJava是Java常见问题的集合。中文翻译

    Simple Java 是 Java 常见问题的集合。中文翻译 ##1。 字符串和数组字符串和数组 字符串是通过引用传递的吗?...常用方法 ...和 ...类和接口 ...子类和超类的构造函数?...常用方法。...常见排序,Collections、Arrays、Tre

    java7hashmap源码-JavaToRemember:Java需要记住的事情

    Collections.sort() //对一个 LIST Arrays.sort() //对一个数组进行排序 Collections.reverse() //对一个 LIST Arrays.toString(char [] a) //转换为字符串 charAt(int x) //获取特定索引处的字符length() //字符串...

    java8集合源码-playJava8:玩Java8

    java8集合源码玩Java8 Lambda 表达式 List&lt; String &gt; names = Arrays . asList( " peter " , " anna " ...Collections ...sort(names, ...方法和构造函数引用 通过使用静态方法引用可以进一步简化上面

    leetcode中等题时间-leetcode-common-patterns:LeetCode问题的常见模式和有用技巧

    Arrays.sort(Object[])和Collections.sort(List)保证是稳定的。 如果需要部分排序,这对于保留原始排序很有用: 堆 对于Java,数据结构是PriorityQueue; 对于 Python,请参阅 heapq 中的函数 K 最小/最大元素来自:...

Global site tag (gtag.js) - Google Analytics