>运用JDK中提供的比较器
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
/**
* 主要类
* @author hyson
*
*/
public class Test2 {
public static void main(String[] args) {
//新建对象列表
List<Man> list = new ArrayList<Man>();
for (int i = 10; i > 0; i--) {
list.add(new Man(i, "a" + i));
}
//转换成数组
Man[] ms = list.toArray(new Man[list.size()]);
for (Man person : ms) {
System.out.println("姓名:" + person.getName() + " 年龄:" + (10 + person.getAge()) + " ");
}
System.out.println();
//对象按年龄排序
Arrays.sort(ms, new CompareManAge());
//对象不转数组直接按年龄排序
//Collections.sort(list,new CompareManAge());
for (Man person : ms) {
System.out.println("姓名:" + person.getName() + " 年龄:" + (10 + person.getAge()) + " ");
}
System.out.println();
}
}
/**
* 实现比较器,对年龄进行比较
*
* @author hyson
*
*/
class CompareManAge implements Comparator<Man> {
public int compare(Man m1, Man m2) {
int temp = 0;
if (m1.getAge() > m2.getAge()) {
temp = 1;
} else if (m1.getAge() == m2.getAge()) {
temp = 0;
} else {
temp = -1;
}
return temp;
}
}
/**
* 要排序的对象
*
* @author hyson
*
*/
class Man {
private int age;
private String name;
public Man(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
>分析比较器
实现原理:
实现比较器接口,排序方法中调用该接口的实现来判定相应字段大小;
Collections类与Arrays类实现了依据比较器接口判定大小的实现排序;
完成对于对象列表排序。
我这里重新定义了下比较器接口,实现如下:
package test;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
/**
* @param args
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
List<People> list = new ArrayList<People>();
for (int i = 10; i > 0; i--) {
list.add(new People(i, "a" + i));
}
People[] ms = list.toArray(new People[list.size()]);
for (People person : ms) {
System.out.println("姓名:" + person.getName() + " 年龄:" + (10 + person.getAge()) + " ");
}
System.out.println();
ClazzSort.sort(ms, new Comp());
for (People person : ms) {
System.out.println("姓名:" + person.getName() + " 年龄:" + (10 + person.getAge()) + " ");
}
System.out.println();
}
}
/**
* 排序类
*
* @author hyson
*
*/
class ClazzSort {
/**
* 提供的排序方法
*
* @param array 数组
* @param c 比较器
*/
public static <T> void sort(T[] array, Comp<? super T> c) {
Object[] out = new Object[array.length];
System.arraycopy(array, 0, out, 0, array.length);
mergeSort(out, array, 0, array.length, c);
}
/**
* Finds the place of specified range of specified sorted array, where the
* element should be inserted for getting sorted array. Uses exponential
* search algorithm.
*
* @param arr - the array with already sorted range
* @param val - object to be inserted
* @param l - the start index
* @param r - the end index
* @param bnd - possible values 0,-1. "-1" - val is located at index more
* then elements equals to val. "0" - val is located at index
* less then elements equals to val.
* @param c - the comparator used to compare Objects
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private static int find(Object[] arr, Object val, int bnd, int l, int r, Comp c) {
int m = l;
int d = 1;
while (m <= r) {
if (c.compare(val, arr[m]) > bnd) {
l = m + 1;
} else {
r = m - 1;
break;
}
m += d;
d <<= 1;
}
while (l <= r) {
m = (l + r) >>> 1;
if (c.compare(val, arr[m]) > bnd) {
l = m + 1;
} else {
r = m - 1;
}
}
return l - 1;
}
/**
* 优化的快速排序
*
* @param in 传入数组
* @param out 传出数组
* @param start 起始位置
* @param end 结束位置
* @param c 比较器
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private static void mergeSort(Object[] in, Object[] out, int start, int end, Comp c) {
//排序数组长度
int len = end - start;
//小于7,运用快速快速排序
if (len <= 7) {
for (int i = start + 1; i < end; i++) {
Object current = out[i];
Object prev = out[i - 1];
//实现比较器类的方法进行比较
if (c.compare(prev, current) > 0) {
int j = i;
do {
out[j--] = prev;
} while (j > start && (c.compare(prev = out[j - 1], current) > 0));
out[j] = current;
}
}
return;
}
//快速排序
int med = (end + start) >>> 1;
mergeSort(out, in, start, med, c);
mergeSort(out, in, med, end, c);
// 合并
// 如果有序不合并返回
if (c.compare(in[med - 1], in[med]) <= 0) {
System.arraycopy(in, start, out, start, len);
return;
}
int r = med, i = start;
// use merging with exponential search
do {
Object fromVal = in[start];
Object rVal = in[r];
if (c.compare(fromVal, rVal) <= 0) {
int l_1 = find(in, rVal, -1, start + 1, med - 1, c);
int toCopy = l_1 - start + 1;
System.arraycopy(in, start, out, i, toCopy);
i += toCopy;
out[i++] = rVal;
r++;
start = l_1 + 1;
} else {
int r_1 = find(in, fromVal, 0, r + 1, end - 1, c);
int toCopy = r_1 - r + 1;
System.arraycopy(in, r, out, i, toCopy);
i += toCopy;
out[i++] = fromVal;
start++;
r = r_1 + 1;
}
} while ((end - r) > 0 && (med - start) > 0);
// 复制剩余数组
if ((end - r) <= 0) {
System.arraycopy(in, start, out, i, med - start);
} else {
System.arraycopy(in, r, out, i, end - r);
}
}
}
/**
* 比较器
*
* @author hyson
*
* @param <T>任意类
*/
interface Com<T> {
int compare(T o1, T o2);
}
/**
* 实现比较器
*
* @author hyson
*
* @param <T>
*/
class Comp<T> implements Com<People> {
public int compare(People m1, People m2) {
int temp = 0;
if (m1.getAge() > m2.getAge()) {
temp = 1;
} else if (m1.getAge() == m2.getAge()) {
temp = 0;
} else {
temp = -1;
}
return temp;
}
}
/**
* 待排序对象
*
* @author hyson
*
*/
class People {
private int age;
private String name;
public People(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}