天天看点

Comparable接口与排序

排序:将一组数据按相应的规则排列顺序。

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);
		
		
	}

}