Java Comparable和Comparator比较

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));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值