Comparator
public static void main(String[] args) {
TreeSet<User> tSet = new TreeSet<User>();
for (int i = 1; i <= 10; i++) {
// 如果泛型User类没有实现Comparable接口,add方法就报错
tSet.add(new User("TreeSet" + i, "TreeSet" + (50 - i)));
}
// Collections.sort(tSet);不能使用,sort里面只能存放List类的对象
for (User user : tSet) {
System.out.println(user.toString());// 因为重写了toString方法,所以会显示User的名字和密码
}
}
class User implements Comparable<User> {
String name = "";
String password = "";
public User(String name, String password) {
this.name = name;
this.password = password;
}
@Override
public int compareTo(User o) {
// TODO Auto-generated method stub
return password.compareTo(o.password);
}
}
Comparable
/**
* 按绝对值进行排序
*/
class AbsComprator implements Comparator<Integer>
{
@Override
public int compare(Integer o1, Integer o2) {
return Math.abs(o1)-Math.abs(o2);
}
}
/**
* 把0排在前面,后面按自然排序
*/
class ZeorFirstComprator implements Comparator<Integer>
{
@Override
public int compare(Integer o1, Integer o2) {
if(o1==0)
return -1;
if(o2==0)
return 1;
return o1.compareTo(o2);
}
}
/**
* 把0排在前面,其他顺序不动。
* 不推荐这么做,可以从后往前一趟遍历搞定,更快捷高效。
*/
class ZeorFirstComprator2 implements Comparator<Integer>
{
@Override
public int compare(Integer o1, Integer o2) {
if(o1==0)
return -1;
if(o2==0)
return 1;
return 0;
}
}
/**
* 原数组不动,对数组元素的索引进行排序。
*/
class IndexComprator implements Comparator<Integer>
{
//原数组
private final int[] arr;
public IndexComprator(int []arr) {
this.arr = arr;
}
@Override
public int compare(Integer o1, Integer o2) {
//根据索引对原值比较
return arr[o1] - arr[o2];
}
}
public class ComparatorDemo {
//把int型数据转换成Integer类型数组
public static Integer[] toIntegerArray(int[] array)
{
Integer[] result = new Integer[array.length];
for(int i=0;i<array.length;i++)
{
result[i] = array[i];
}
return result;
}
public static void main(String[] args) {
int []arr = {1,3,10,5,0,-4,-3,0,-1,-5,9,-10};
//按绝对值排序
Integer []arr1 = toIntegerArray(arr);
Arrays.sort(arr1, new AbsComprator());
System.out.println(Arrays.toString(arr1));
//把0写在最前面,其他进行自然排序
Integer []arr2 = toIntegerArray(arr);
Arrays.sort(arr2, new ZeorFirstComprator());
System.out.println(Arrays.toString(arr2));
//把0写在前面,其他不动
Integer []arr3 = toIntegerArray(arr);
Arrays.sort(arr3, new ZeorFirstComprator2());
System.out.println(Arrays.toString(arr3));
//对索引进行排序
Integer []arr4 = new Integer[arr.length];
for(int i=0;i<arr.length;i++)
arr4[i] = i;//创建索引
Arrays.sort(arr4, new IndexComprator(arr));
System.out.println(Arrays.toString(arr4));
for(int i=0;i<arr4.length;i++)
{
//按索引从小到大打印
System.out.print(arr[arr4[i]]+", ");
}
System.out.println();
//有了索引排序很容易计算出名次
Integer[] arr5 = new Integer[arr.length];
for(int i=0;i<arr.length;i++)
{
//计算名次
arr5[arr4[i]] = i+1;
}
System.out.println(Arrays.toString(arr));
//从小到大排名
System.out.println(Arrays.toString(arr5));
}
}