本篇文章是在之前文章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笔记——引用类型的比较。
网友评论