Java数组排序Arrays.sort,以及Comparator接口的用法

时间:2021-01-26 02:52:41

有的时候需要对数组里的element进行排序。当然可以自己编写合适的排序方法,但既然java包里有自带的Arrays.sort排序方法,在 数组元素比较少的时候为何不用?

  Sorting an Array 1. 数字排序  int[] intArray = new int[] { 4, 1, 3, -23 };

  Arrays.sort(intArray);

  输出: [-23, 1, 3, 4]

  2. 字符串排序,先大写后小写 String[] strArray = new String[] { "z", "a", "C" };

  Arrays.sort(strArray);

  输出: [C, a, z]

  3. 严格按字母表顺序排序,也就是忽略大小写排序 Case-insensitive sort

  Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);

  输出: [a, C, z]

  4. 反向排序, Reverse-order sort

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

  输出:[z, a, C]

  5. 忽略大小写反向排序 Case-insensitive reverse-order sort

  Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);

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

  输出: [z, C, a]

  java初学者最常见的错误思想,就是试图去写一些方法来完成数组的排序功能,其实,数组排序功能,在java的api里面早已实现,我们没有 必要去重复制造*。

  Arrays类有一个静态方法sort,利用这个方法我们可以传入我们要排序的数组进去排序,因为我们传入的是一个数组的引用,所以排序完成的 结果也通过这个引用的来更改数组.对于整数、字符串排序,jdk提供了默认的实现,如果要对一个对象数组排序,则要自己实现 java.util.Comparator接口。

[java]  view plain copy print ?
  1. package com.gjh.gee.arrays;  
  2. import java.util.Arrays;  
  3. public class ArraySortDemo {  
  4.     public void sortIntArray() {  
  5.         int[] arrayToSort = new int[] { 4858980812345162 };  
  6.         System.out.println("排序前");  
  7.         for (int i = 0; i < arrayToSort.length; i++)  
  8.             System.out.println(arrayToSort[i]);  
  9.         // 调用数组的静态排序方法sort  
  10.         Arrays.sort(arrayToSort);  
  11.         System.out.println("排序后");  
  12.         for (int i = 0; i < arrayToSort.length; i++)  
  13.             System.out.println(arrayToSort[i]);  
  14.     }  
  15.     public void sortStringArray() {  
  16.         String[] arrayToSort = new String[] { "Oscar""Charlie""Ryan",  
  17.         "Adam""David" };  
  18.         System.out.println("排序前");  
  19.         for (int i = 0; i < arrayToSort.length; i++)  
  20.             System.out.println(arrayToSort[i]);  
  21.         System.out.println("排序后");  
  22.         // 调用数组的静态排序方法sort  
  23.         Arrays.sort(arrayToSort);  
  24.         for (int i = 0; i < arrayToSort.length; i++)  
  25.             System.out.println(arrayToSort[i]);  
  26.     }  
  27.     public void sortObjectArray() {  
  28.         Dog o1 = new Dog("dog1"1);  
  29.         Dog o2 = new Dog("dog2"4);  
  30.         Dog o3 = new Dog("dog3"5);  
  31.         Dog o4 = new Dog("dog4"2);  
  32.         Dog o5 = new Dog("dog5"3);  
  33.         Dog[] dogs = new Dog[] { o1, o2, o3, o4, o5 };  
  34.         System.out.println("排序前");  
  35.         for (int i = 0; i < dogs.length; i++) {  
  36.             Dog dog = dogs[i];  
  37.             System.out.println(dog.getName());  
  38.         }  
  39.         Arrays.sort(dogs, new ByWeightComparator());  
  40.         System.out.println("排序后:");  
  41.         for (int i = 0; i < dogs.length; i++) {  
  42.             Dog dog = dogs[i];  
  43.             System.out.println(dog.getName());  
  44.         }  
  45.     }  
  46.     public static void main(String[] args) {  
  47.         ArraySortDemo t = new ArraySortDemo();  
  48.         t.sortIntArray();  
  49.         t.sortStringArray();  
  50.         t.sortObjectArray();  
  51.     }  
  52. }  

[java]  view plain copy print ?
  1. package com.gjh.gee.arrays;  
  2. public class Dog {  
  3.     private String name;  
  4.     private int weight;  
  5.     public Dog(String name, int weight) {  
  6.         this.setName(name);  
  7.         this.weight = weight;  
  8.     }  
  9.     public int getWeight() {  
  10.         return weight;  
  11.     }  
  12.     public void setWeight(int weight) {  
  13.         this.weight = weight;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21. }  

[java]  view plain copy print ?
  1. package com.gjh.gee.arrays;  
  2. import java.util.Comparator;  
  3. public class ByWeightComparator implements Comparator {  
  4.     public final int compare(Object pFirst, Object pSecond) {  
  5.         int aFirstWeight = ((Dog) pFirst).getWeight();  
  6.         int aSecondWeight = ((Dog) pSecond).getWeight();  
  7.         int diff = aFirstWeight - aSecondWeight;  
  8.         if (diff > 0)  
  9.             return 1;  
  10.         if (diff < 0)  
  11.             return -1;  
  12.         else  
  13.             return 0;  
  14.     }  
  15. }  

 

下面补充一个Collections.sort排序,原理和Arrays.sort差不多。

  1. //一个POJO例子  
  2. class User {  
  3.  String name;  
  4.  String age;  
  5.    
  6.  public User(String name,String age){  
  7.   this.name=name;  
  8.   this.age=age;  
  9.  }  
  10.  public String getAge() {  
  11.   return age;  
  12.  }  
  13.  public void setAge(String age) {  
  14.   this.age = age;  
  15.  }  
  16.  public String getName() {  
  17.   return name;  
  18.  }  
  19.  public void setName(String name) {  
  20.   this.name = name;  
  21.  }   
  22. }  
  23.   
  24. //具体的比较类,实现Comparator接口  
  25. import java.util.Comparator;  
  26. import java.util.List;  
  27. import java.util.ArrayList;  
  28. import java.util.Collections;  
  29. public class ComparatorUser implements Comparator{  
  30.  public int compare(Object arg0, Object arg1) {  
  31.   User user0=(User)arg0;  
  32.   User user1=(User)arg1;  
  33.    //首先比较年龄,如果年龄相同,则比较名字  
  34.   int flag=user0.getAge().compareTo(user1.getAge());  
  35.   if(flag==0){  
  36.    return user0.getName().compareTo(user1.getName());  
  37.   }else{  
  38.    return flag;  
  39.   }    
  40.  }  
  41.    
  42. }  
  43.   
  44. //测试类  
  45. public class SortTest {  
  46.    
  47.  public static void main(String[] args){  
  48.   List userlist=new ArrayList();  
  49.   userlist.add(new User("dd","4"));  
  50.   userlist.add(new User("aa","1"));  
  51.   userlist.add(new User("ee","5"));  
  52.   userlist.add(new User("bb","2"));    
  53.   userlist.add(new User("ff","5"));  
  54.   userlist.add(new User("cc","3"));  
  55.   userlist.add(new User("gg","6"));  
  56.     
  57.   ComparatorUser comparator=new ComparatorUser();  
  58.   Collections.sort(userlist, comparator);  
  59.      
  60.   for (int i=0;i<userlist.size();i++){  
  61.    User user_temp=(User)userlist.get(i);  
  62.       System.out.println(user_temp.getAge()+","+user_temp.getName());   
  63.   }  
  64.     
  65.  }  
  66. }  

 


 //首先年龄排序,如果年龄相同,则按名字排序

结果:
   1, aa
   2, bb
   3, cc
   4, dd
   5, ee                    //注意:同样是5岁的人,则比较名字(ee,ff),然后排序
   5, ff
   6, gg