写在前面
我们都知道java有个优势就是代码的重用性比较高,那么如何实现所谓“重用性”呢???
例子一枚
就拿一个最简单的例子来说吧,对数组{112,25,3,44,5}进行冒泡排序
那么我们很容易的就可以写出一个冒泡排序的函数如下
public static void bubbleSort(int[] arr) { boolean flage = true; for (int i = 0; flage && i < arr.length - 1; i++) { flage = false; for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flage = true; } } } }
初步改进
很显然这个函数可以应对整形数组的排序,但是如果针对一个浮点型数组,那么该函数就无法处理,
也许你会说,可以再改成一个浮点型的,那么就既可以处理整形也可以处理浮点型了
public static void bubbleSort(double[] arr) { boolean flage = true; for (int i = 0; flage && i < arr.length - 1; i++) { flage = false; for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { double temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flage = true; } } } }
再次改进
那么如果针对的是一个字符型的数组呢????
如果说针对的是一个字符串型的数组呢???
如果我既要从小到大排序又要从大到小排序呢???
如果我要根据人的重量对人进行排序呢????
很显然我们需要的是一个可以处理数组元素是任意的,可以自己决定比较的属性的一个方法
public static <T> void bubbleSort(T[] arr, Comparator cmp) { boolean flage = true; for (int i = 0; flage && i < arr.length - 1; i++) { flage = false; for (int j = 0; j < arr.length - i - 1; j++) { if (cmp.compare(arr[j], arr[j + 1]) > 0) { T temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flage = true; } } } }
那么现在就可以处理数组元素是任意的情况了,只需要根据自己的需求创建不用的比较器即可
import java.util.Comparator; /** * @author_Stone6762 */ public class FirstMin implements Comparator<Integer> { @Override public int compare(Integer i1, Integer i2) { return i2 - i1; } }
import java.util.Comparator; /** * @author_Stone6762 */ public class FirstMax implements Comparator<Integer> { @Override public int compare(Integer i1, Integer i2) { return i1-i2; } }
最后
因为中间牵扯到一个问题就是,“工人”,“学生”都是“人”,二者很显然可以比较体重。
但是比较器针对的对象只能是一个
所以必须对函数进行修改
public static <T> void bubbleSort(T[] arr, Comparator<? super T> cmp) { boolean flage = true; for (int i = 0; flage && i < arr.length - 1; i++) { flage = false; for (int j = 0; j < arr.length - i - 1; j++) { if (cmp.compare(arr[j], arr[j + 1]) > 0) { T temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flage = true; } } } }