“排序”的实体类都实现了java.lang.Comparable接口。Comparable接口中只有一个方法:
public int compareTo(Object obj);
该方法:
返回0 this == obj
返回正数 this > obj
返回负数 this < obj
实现了Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式。
一、引用数据类型
1、内置类
(1)整数、小数Integer Float Double 直接比较基本数据类型的大小
(2)字符:比较unicode码之差
(3)字符串:
1)如果其中一个是另外一个字符串起始开始的子串,返回长度只差。
例如:“abc”和“abcdef”返回-3
2)否则返回第一个不相等的unicode码之差
例如:“abc”和"aef"比的是“b”和“e”,结果是-3
(4)java.util.Date:根据日期的长整型数比较
下面是例子。
先写一个工具类Utils。里面用到了冒泡排序。在排序时不是用大于小于号去比较大小,而是用compareTo方法。
1 package com.bjsxt.sort.innerType; 2 3 import java.util.List; 4 5 /** 6 * 排序 7 * 8 */ 9 public class Utils { 10 /** 11 * 容器排序(使用泛型方法) 12 */ 13 public static <T extends Comparable<T>> void sort(List<T> list) { 14 //第一步:转成数组 15 Object[] arr = list.toArray(); 16 sort(arr); 17 //第二步:改变容器中对应的值 18 for(int i=0;i<arr.length;i++) { 19 list.set(i, (T)(arr[i])); 20 } 21 } 22 23 /** 24 * 数组排序(使用泛型方法) 25 */ 26 public static <T extends Comparable<T>> void sort(T[] arr) { 27 //从大到小排序 28 boolean sorted = true; 29 int len = arr.length; 30 for(int j=0;j<len-1;j++) { 31 sorted = true; 32 for(int i=0;i<len-1-j;i++) { 33 if(((Comparable)arr[i]).compareTo(arr[i+1])<0) { 34 T temp = arr[i]; 35 arr[i] = arr[i+1]; 36 arr[i+1] = temp; 37 sorted = false; 38 } 39 } 40 if(sorted) { 41 break; 42 } 43 } 44 } 45 46 47 /** 48 * 数组的排序(降序) 49 * @param arr 50 */ 51 public static void sort(Object[] arr) { 52 //从大到小排序 53 boolean sorted = true; 54 int len = arr.length; 55 for(int j=0;j<len-1;j++) { 56 sorted = true; 57 for(int i=0;i<len-1-j;i++) { 58 if(((Comparable)arr[i]).compareTo(arr[i+1])<0) { 59 Object temp = arr[i]; 60 arr[i] = arr[i+1]; 61 arr[i+1] = temp; 62 sorted = false; 63 } 64 } 65 if(sorted) { 66 break; 67 } 68 } 69 } 70 }
然后写几个例子用一下工具类看看。
1 package com.bjsxt.sort.innerType; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Date; 6 import java.util.List; 7 8 public class Demo04 { 9 public static void main(String[] args) { 10 Date[] arr = new Date[3]; 11 arr[0] = new Date(); 12 arr[1] = new Date(System.currentTimeMillis() - 1000*60*60); 13 arr[2] = new Date(System.currentTimeMillis() + 1000*60*60); 14 15 Utils.sort(arr); //降序 16 System.out.println(Arrays.toString(arr)); 17 //结果是:[Sat Jan 20 16:52:50 CST 2018, Sat Jan 20 15:52:50 CST 2018, Sat Jan 20 14:52:50 CST 2018] 18 19 //字符串 20 String[] arr2 = {"a","abcd","abc","def"}; 21 Utils.sort(arr2); 22 System.out.println(Arrays.toString(arr2)); 23 //结果是:[def, abcd, abc, a] 24 25 System.out.println("=========List排序=========="); 26 //存放容器中 27 List<String> list = new ArrayList<String>(); 28 list.add("a"); 29 list.add("abcd"); 30 list.add("abc"); 31 list.add("def"); 32 Utils.sort(list); 33 System.out.println(list); 34 //结果是:[def, abcd, abc, a] 35 } 36 }