前言
上一篇文章算法篇——选择排序SelectionSort已经简单的介绍了选择排序,但是存在一个缺陷——在方法
sort
当中参数array
给的是一个整型,但是如果我想要比较浮点型
,字符串
这些对象呢,在实际开发过程当中肯定会根据自定义的规则进行排序,而不是简单的数字大小排序。因此就需要用到接口Comparable<T>
并且实现其方法compareTo(Object o)
来自定义规则。
场景
包装类型及String比较
上面提到了如果有如果存在字符串或者浮点类型该如何比较呢,能否写一个比较通用的方法来解决。这是可以的。
先上选择排序
的算法吧!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32/**
* 使用选择排序来进行自定义规则排序
*
* @param arr 将要排序的数组
*/
public static void sort(Comparable[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
int minIndex = i;
for (int j = i; j < n; j++) {
//是用CompareTo方法比较两个Comparable对象的大小
if (arr[j].compareTo(arr[minIndex]) < 0) {
minIndex = j;
}
}
swap(arr, i, minIndex);
}
}
/**
* 对换数组指定索引位置的值
*
* @param arr 目标操作数组
* @param i 源索引
* @param minIndex 替换索引
*/
private static void swap(Object[] arr, int i, int minIndex) {
Object temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
在上面sort()
当中提到了CompareTo
,在次方法当中的源码中可以看到大小写比较的解释。
1 | /* @param o the object to be compared. |
negative
负数返回小于,zero
返回equal
相等,然后positive
整数放回大于。同时基本数据类型的包装类型都有,还有字符串也实现了这个接口,因此我们对字符串或者浮点型操作时候直接可以使用。操作如下:main方法当中测试的代码块
1 | //测试Integer |
自定义对象比较
需求分析
如果我们对学生Student
进行排序比较,定义规则分数socre由小到大,分数相同名字name字典序排列
。正对这样的规则,那么就办法直接使用CompareTo方法了,需要在我们自定义类当中进行实现接口。
- 实现接口
Comparable<Student>
- 重写方法
compareTo(Object o)
- 定义比较
大小
规则
针对上面的步骤,首先给出Student
类当中的代码:
1 | package algorithm; |
上面重写toString()
只是方便打印。
1 | if (this.score.equals(student.score)) { |
上面if
语句就是之前提到的规则,如果分数socre
相等,那么按照名字name
的字典序进行排序。结果在下面展示。
实现及结果
上面定义Student
类,下面给出在main
方法当中使用的结果,及其结果:
1 | // 测试自定义类型Student |
在上面的代码当中我们定义了5个Student
类的对象,同时A,E
两个分数相同,按照字典序进行排列,应该A
在 E
的前面,同时两者相挨着。然后分数socre
是按照从小到大的顺序排列的。
运行上面代码块,显示的结果如下。
1 | 整型排序如下: |
联系
聪聪的独立博客 ,一个喜欢技术,喜欢钻研的95后。如果你看到这篇文章,千里之外,我在等你联系。