排序:将一組資料按相應的規則排列順序。
1. 規則:
基本資料類型:如資料,就是日常的大小排序
引用資料類型:
a)内置類(String、Integer等),内部已經指定規則,直接使用即可
b)自定義類,需要按業務規則排序
2.順序
升序:從小到大
降序::從大到小
3.排序:算法 如:冒泡、選擇、插入、shell、堆等
Comparable 接口
“排序”的實體類都實作了java.lang.Comparable 接口,comparable 接口中隻有一個方法
public int compareTo(Object obj);
該方法為:
傳回 0:表示 this == obj ;
傳回正數:表示 this > obj ;
傳回負數:表示 this < obj ;
package com.bjsxt.sort.innerType;
/**
* 内置引用資料類型(常用)的比較
* @author Administrator
*
*/
public class Demo01 {
/**
* @param args
*/
public static void main(String[] args) {
Integer a ; //根據基本資料類型大小
Character ch; //根據Unicode編碼順序
String str="abc"; //如果其中一個是例外一個起始開始的子串,傳回長度之差
String str2 ="abcd123"; //否則傳回第一個不相等的unicode碼之差
System.out.println(str.compareTo(str2));
str ="abc";
str2 ="aad";
System.out.println(str.compareTo(str2));
java.util.Date d ; //根據日期的長整形數比較
}
}
實作了Comparable 接口的類通過實作 compareTo 方法進而确定該類對象的排序方式:
Comparator接口
思考:很多排序規則
---淘寶商店 價格 點選量 名稱等
---隻有位元組碼沒有源碼
提供排序的比較器,業務比較器
---實作java.util.Comparator 接口;
---重寫 public int compare(T o1,T,o2);
作用:
---解耦:獨立于實體類
---友善:便于應對各種排序規則
第一個JAVA檔案
package com.bjsxt.sort.innerType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class Demo04 {
/**
* @param args
*/
public static void main(String[] args) {
Date[] arr =new Date[3];
arr[0] =new Date();
arr[1] =new Date(System.currentTimeMillis()-1000*60*60);
arr[2] =new Date(System.currentTimeMillis()+1000*60*60);
Utils.sort(arr); //降序
System.out.println(Arrays.toString(arr));
//字元串
String[] arr2 ={"a","abcd","abc","def"};
Utils.sort(arr2);
System.out.println(Arrays.toString(arr2));
System.out.println("==========List排序===========");
//存放容器中
List<String> list =new ArrayList<String>();
list.add("a");
list.add("abcd");
list.add("abc");
list.add("def");
Utils.sort(list);
System.out.println(list);
System.out.println("==========使用Comparator 排序數組===============");
arr2 =new String[]{"a","abcd","abc","def"};
Utils.sort(arr2,new StringComp());
System.out.println(Arrays.toString(arr2));
System.out.println("==========List排序+比較器===========");
list =new ArrayList<String>();
list.add("a");
list.add("abcd");
list.add("abc");
list.add("def");
Utils.sort(list,new StringComp());
System.out.println(list);
}
}
第二個Java檔案
package com.bjsxt.sort.innerType;
import java.util.Comparator;
import java.util.List;
public class Utils {
public static <T> void sort(List<T> list,Comparator<T> com){
//第一步:轉成數組
Object[] arr =list.toArray();
sort(arr,com);
//第二步:改變容器中對應的值
for(int i=0;i<arr.length;i++){
list.set(i, (T)(arr[i]));
}
}
public static <T> void sort(Object[] arr,Comparator<T> com){
//從大到小排序 降序
boolean sorted= true;
int len =arr.length;
for(int j=0;j<len-1;j++){ //趟數
sorted =true; //假定有序
for(int i=0;i<len-1-j;i++){ //次數
if(com.compare((T)arr[i], (T)arr[i+1])<0){
Object temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] =temp;
sorted =false; //假定失敗
}
}
if(sorted){ //減少趟數
break;
}
}
}
public static <T extends Comparable<T>> void sort(List<T> list){
//第一步:轉成數組
Object[] arr =list.toArray();
sort(arr);
//第二步:改變容器中對應的值
for(int i=0;i<arr.length;i++){
list.set(i, (T)(arr[i]));
}
}
public static <T extends Comparable<T>> void sort(T[] arr){
//從大到小排序 降序
boolean sorted= true;
int len =arr.length;
for(int j=0;j<len-1;j++){ //趟數
sorted =true; //假定有序
for(int i=0;i<len-1-j;i++){ //次數
if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
T temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] =temp;
sorted =false; //假定失敗
}
}
if(sorted){ //減少趟數
break;
}
}
}
public static void sort(Object[] arr){
//從大到小排序 降序
boolean sorted= true;
int len =arr.length;
for(int j=0;j<len-1;j++){ //趟數
sorted =true; //假定有序
for(int i=0;i<len-1-j;i++){ //次數
if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
Object temp = arr[i];
arr[i] =arr[i+1];
arr[i+1] =temp;
sorted =false; //假定失敗
}
}
if(sorted){ //減少趟數
break;
}
}
}
}
第三個Java檔案
package com.bjsxt.sort.innerType;
public class StringComp implements java.util.Comparator<String>{
@Override
public int compare(String o1, String o2) {
int len1 =o1.length();
int len2 =o2.length();
return -(len1-len2);
}
}
第四個java檔案
package com.bjsxt.sort.innerType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 使用Collections對容器的比較
* 1、 public static <T> void sort(List<T> list, Comparator<? super T> c)
* 2、public static <T extends Comparable<? super T>> void sort(List<T> list)
* void sort(List<T> list)
* @author Administrator
*
*/
public class Demo05 {
/**
* @param args
*/
public static void main(String[] args) {
List<String> list =new ArrayList<String>();
list.add("a");
list.add("abcd");
list.add("abc");
list.add("def");
Collections.sort(list,new StringComp());
System.out.println(list);
list =new ArrayList<String>();
list.add("a");
list.add("abcd");
list.add("abc");
list.add("def");
Collections.sort(list);
System.out.println(list);
}
}