美文网首页
Java笔记——引用类型的排序

Java笔记——引用类型的排序

作者: 振礼硕晨 | 来源:发表于2019-01-08 10:08 被阅读0次

本篇文章是在之前文章Java笔记——引用类型的比较的基础之上进行的,所以建议大家简单阅读一下这篇文章。

一、排序算法基础

说到排序,我们最熟悉的应该是冒泡排序算法,冒泡排序的思想可以简单的归纳为:比较和交换。对于基本的数值类型(int、double、float等),我们可以很方便的使用冒泡算法进行排序。下面给出一个冒泡排序算法的实例,后面的引用类型的排序,也是在这个基础之上进行的。

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {2, 55, 6, 9, 88, 20, 13};

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

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

二、手写引用类型排序算法

我们自己动手写引用类型排序算法的时候,可以将该算法封装在一个业务类中,通过调用这个业务类实例对象中的排序算法对引用类型进行排序,下面给出一个实例:

import java.util.Arrays;

/**
 * 传入一个字符串数组,通过字符串的长度大小进行排序
 * 长度越短,位置越靠前
 */
public class LengthCom {
    
    public void sort(String[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j].length() >= arr[j + 1].length()) {
                    String temp;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    // 测试
    public static void main(String[] args) {
        String testArr[] = {"feng", "zz", "I am very hepply", "Tom", "Hello world", "love"};
        
        System.out.println("====================排序之后的结果是====================");
        new LengthCom().sort(testArr);
        System.out.println(Arrays.toString(testArr));
        // [zz, Tom, love, feng, Hello world, I am very hepply]
    }
}

在上面的排序算法中,我们通过冒泡算法根据字符串长短进行排序。这是基础的写法,我们可以对该写法进行改进:传入参数的时候,不仅传入字符串输入,还传入一个比较器,下面给出实例:

首先我们定义一个比较器

/**
 * 定义一个比较器,比较两个字符串的长度,有三种返回结果
 * 0:  相等
 * 1:  前者大于后者
 * -1: 前者小于后者
 */

import java.util.Comparator;

public class StringLengthCom implements Comparator<String> {

    @Override
    public int compare(String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        int result = 0;
        
        if (len1 > len2) {
            result = 1;
        }
        if (len1 < len2) {
            result = -1;
        }
        
        return result;
    }
}

重写排序算法,使用比较器代替之前的比较逻辑

public void sort(String[] arr, Comparator<String> com) {

    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (com.compare(arr[j], arr[j + 1]) > 0) {      // 注意这里的变化
                String temp;
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

调用此排序算法进行排序

public static void main(String[] args) {
    String testArr[] = {"feng", "zz", "I am very hepply", "Tom", "Hello world", "love"};

    System.out.println("====================排序之后的结果是====================");
    new LengthCom().sort(testArr, new StringLengthCom());      // 传入我们定义的比较器实例
    System.out.println(Arrays.toString(testArr));
    //[zz, Tom, love, feng, Hello world, I am very hepply]
}

上面是使用冒泡排序算法对数组进行排序,我们也可以使用类似的方式对容器List进行排序,实例如下:

排序算法,和上面的类似

public void sort(List<String> arr, Comparator<String> com) {

    for (int i = 0; i < arr.size() - 1; i++) {
        for (int j = 0; j < arr.size() - i - 1; j++) {
            if (com.compare(arr.get(j), arr.get(j + 1)) > 0) {
                String temp;
                temp = arr.get(j);
                arr.set(j, arr.get(j + 1));
                arr.set(j + 1, temp);
            }
        }
    }
}

调用此方式进行排序

public static void main(String[] args) {
    
    List<String> list = new ArrayList<String>();
    list.add("feng");
    list.add("zz");
    list.add("I am very hepply");
    list.add("Hello world");
    list.add("love you");

    new LengthCom().sort(list, new StringLengthCom());

    // 遍历输出
    for (String item : list) {
        System.out.print(item + "\t");
    }
}

三、使用Collections中的排序算法

在上面的实例中,我们使用手写的排序算法对容器List进行排序,除了这个方法之外,我们还可以使用 Collections 类写好的排序算法进行排序。传入我们定义的比较器,可以根据我们的需求实现各种条件的排序。下面给出实例:

定义比较器

/**
 * 定义一个比较器,比较两个字符串的长度,有三种返回结果
 * 0:  相等
 * 1:  前者大于后者
 * -1: 前者小于后者
 */

import java.util.Comparator;

public class StringLengthCom implements Comparator<String> {

    @Override
    public int compare(String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        int result = 0;
        
        if (len1 > len2) {
            result = 1;
        }
        if (len1 < len2) {
            result = -1;
        }
        
        return result;
    }
}

调用Collections类中的 sort()方法,进行排序

public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("feng");
    list.add("zz");
    list.add("I am very hepply");
    list.add("Hello world");
    list.add("love you");

    Collections.sort(list,new StringLengthCom());

    for (String item : list) {
        System.out.print(item + "----");
    }
}

四、总结

以上便是我对引用类型排序的归纳总结,相对来说比较简单,在进行排序的时候我们需要注意两个点:排序算法和比较器。我们应该首先根据需求定义好比较器,然后在排序算法中,通过该比较器决定是否应该交换位置顺序。

上面的实例中,比较器全部都是使用 Comparator 接口中的 compare() 方法进行定义的,初次之外,我们还可以使用Comparable的compareTo() 方法进行进行定义。关于引用类型的比较,大家可以参考我之前的一篇文章:Java笔记——引用类型的比较

相关文章

网友评论

      本文标题:Java笔记——引用类型的排序

      本文链接:https://www.haomeiwen.com/subject/qfxhrqtx.html