对象比较的三种方式

构建对象

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
class Compar implements Comparable{
    private String name;
    private Integer age;
    
    /**
     * 先按年龄排序,如果年龄一样则按名字排序
     */
    @Override
    public int compareTo(Object o) {
        Compar compar = (Compar) o;
        int i = this.age - compar.age;
        if (i==0){
            i = this.name.compareTo(compar.name);
        }
        return i;
        
    }
}

第一种方式 类实现了Comparable接口

测试 1

		//构建一个集合
		Compar compar1 = new Compar("a", 10);
        Compar compar2 = new Compar("b", 10);
        Compar compar3 = new Compar("x", 10);
        Compar compar4 = new Compar("e", 1);
        List<Compar> comparList = new ArrayList<>(Arrays.asList(compar2, compar1, 	compar3, compar4));
        
        //使用比较
        Collections.sort(comparList);
        
        //输出
        for (Compar compar : comparList) {
            System.out.println("compar = " + compar);
        }

		/**
         * compar = Compar(name=e, age=1)
		 * compar = Compar(name=a, age=10)
		 * compar = Compar(name=b, age=10)
		 * compar = Compar(name=x, age=10)
         */

第二种方式 使用TreeSet (不管类实现的Comparable接口)

测试 2

		Compar compar1 = new Compar("a", 10);
        Compar compar2 = new Compar("b", 10);
        Compar compar3 = new Compar("x", 10);
        Compar compar4 = new Compar("e", 1);

        //按名字排序
		TreeSet<Compar> treeSet = new TreeSet<>(new Comparator<Compar>() {
            @Override
            public int compare(Compar o1, Compar o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        
		//如你所见 上边使用了 匿名内部类 所以可以用lambda简化 如下:
		//TreeSet<Compar> treeSet = new TreeSet<>((o1, o2) -> o1.getName().compareTo(o2.getName()));
		//还可以再简化 (o1, o2) -> o1.getName().compareTo(o2.getName()) 可被替换为 'Comparator.comparing'
		//TreeSet<Compar> treeSet = new TreeSet<>(Comparator.comparing(Compar::getName));

		//收集元素
        treeSet.add(compar1);
        treeSet.add(compar2);
        treeSet.add(compar3);
        treeSet.add(compar4);
        //输出
        for (Compar compar : treeSet) {
            System.out.println("compar = " + compar);
        }
        /**
         * compar = Compar(name=a, age=10)
         * compar = Compar(name=b, age=10)
         * compar = Compar(name=e, age=1)
         * compar = Compar(name=x, age=10)
         */
        

第三种方式 使用流 (不管类实现的Comparable接口)

测试 3

		Compar compar1 = new Compar("a", 10);
        Compar compar2 = new Compar("b", 10);
        Compar compar3 = new Compar("x", 10);
        Compar compar4 = new Compar("e", 1);
        List<Compar> comparList = new ArrayList<>(Arrays.asList(compar2, compar1, 	compar3, compar4));
        
        //先按年龄排序,如果年龄一样则按名字排序
		List<Compar> collect = comparList.stream().sorted(Comparator.comparingInt(Compar::getAge).thenComparing(Compar::getName).collect(Collectors.toList());

		//输出
        for (Compar compar11 : collect) {
            System.out.println("compar11 = " + compar11);
        }
        
		/**
         * compar = Compar(name=e, age=1)
		 * compar = Compar(name=a, age=10)
		 * compar = Compar(name=b, age=10)
		 * compar = Compar(name=x, age=10)
         */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值