Java300学习笔记(12)——Comparable 和 Comparator排序工具类实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/86652008

1 java.lang.Comparable

1.1 引用类型之内置类比较大小

  • 整数、小数等直接比较基本数据类型的大小;
  • 字符: 比较 Unicode 码之差
  • 字符串
* 如果其中一个是另外一个起始开始的子串,返回长度之差
* 否则返回 第一个不相等的 Unicode 码之差

  • java.util.Date ,根据日期的长整型比较

1.1.1 字符串数组比较案例

package day04.compara;

import java.util.Arrays;

public class Demo1 {


    public static void main(String[] args) {
        String[] arr = {"abcd", "a", "def", "abc"};
        bubbleSort(arr);
    }

    public static void bubbleSort(String[] arr) {
        boolean sortFlag = true;
        for (int j = 0; j < arr.length - 1; j++) { //趟数
            sortFlag = true;

            for (int i = 0; i < arr.length - 1 - j; i++) {
                if (arr[i].compareTo(arr[i + 1]) > 0) {
                    String temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;

                    sortFlag = false;
                }
                System.out.println(Arrays.toString(arr));
            }

            if (sortFlag) {  // 减少趟数
                break;
            }

        }
    }

}

[a, abcd, def, abc]
[a, abcd, def, abc]
[a, abcd, abc, def]
[a, abcd, abc, def]
[a, abc, abcd, def]
[a, abc, abcd, def]

Process finished with exit code 0

1.1.2 日期比较

package day04.compara;

import java.util.Arrays;
import java.util.Date;

public class DateCompare {

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

        //从大到小排序
        boolean sortFlag = true;
        for (int j = 0; j < arr.length - 1; j++) {
            sortFlag = true;
            for (int i = 0; i < arr.length - 1 - j; i++) {
                if (arr[i].compareTo(arr[i + 1]) < 0) {
                    Date temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                    sortFlag = false;
                }
            }

            if (sortFlag) {
                break;
            }
        }

        System.out.println(Arrays.toString(arr));

    }
}

[Fri Jan 25 22:45:57 CST 2019, Fri Jan 25 21:45:57 CST 2019, Fri Jan 25 20:45:57 CST 2019]

2 java.util.Comparator

  • 提供排序的比较器,业务比较器
  • 重写 public int compare(T o1,T o2)

  • 作用:(1)解耦:独立于实体类;(2)方便:便于应对各种排序规则

  • StringCompare.java
package day04.compara;

import java.util.Comparator;
public class StringCompare implements Comparator<String> {

    //按照长度比较
    @Override
    public int compare(String o1, String o2) {
        int len1 = o1.length();
        int len2 = o2.length();

        return len1 - len2;
    }
}

package day04.compara;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class MyUtils {

    /*
     * 数组的排序(降序) + Comparator 接口
     * */
    public static <T> void sortArray(Object[] arr, Comparator<T> com) {
        boolean sortFlag = true;

        for (int j = 0; j < arr.length - 1; j++) {
            sortFlag = true;
            for (int i = 0; i < arr.length - 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;
                    sortFlag = false;
                }
            }

            if (sortFlag) {
                break;
            }
        }
    }


    /***
     * @Description: list 的排序 + 比较器
     * @param list
     * @param com
     * @return void
     */
    public static <T> void sortList(List<T> list, Comparator<T> com) {
        Object[] arr = list.toArray();
        sortArray(arr, com);

        for (int i = 0; i < arr.length; i++){
            list.set(i,(T)arr[i]);
        }
    }


    public static void main(String[] args) {
        String[] arr = {"a", "abcd", "def", "abc"};
        sortArray(arr, new StringCompare());
        System.out.println("========= 使用 Comparator 排序数组================");
        System.out.println(Arrays.toString(arr));

        List<String> list= new ArrayList<>();
        list.add("a");
        list.add("abcd");
        list.add("abc");
        list.add("de");
        sortList(list,new StringCompare());
        System.out.println("========= 使用 Comparator 排序列表================");
        System.out.println(list);

    }

}

========= 使用 Comparator 排序数组================
[abcd, def, abc, a]
========= 使用 Comparator 排序列表================
[abcd, abc, de, a]

3 排序工具类 Collections

  • Collections 工具类提供了大量便于处理容器的方法
  • public static <T extends Comparable<? super T>> void sort(List<T> list)
  • public static <T> void sort(List<T> list, Comparator<? super T> c)
package day04.compara;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Demo2 {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("a");
        list.add("abcd");
        list.add("abc");
        list.add("def");

        Collections.sort(list,new StringCompare());
        System.out.println("===== comparator=========");
        System.out.println(list);


        List<String> list2 = new ArrayList<>();
        list2.add("a");
        list2.add("abcd");
        list2.add("abc");
        list2.add("def");
        Collections.sort(list2);
        System.out.println("=====comparable=======");
        System.out.println(list2);

    }

}

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/86652008