Java小知识:实现可比的TreeSet

下面的第一个示例显示了将对象添加到集合中时的常见错误。由于集合中的每个元素都是唯一的,因此在添加任何对象之前,必须先将其与集合中的对象进行比较。
1.可比接口的常见错误
首先看一下下面的代码,该代码创建3条狗并将这些狗添加到TreeSet中。
import java.util.TreeSet;
class Dog {
int size;
Dog(int s) {
size = s;
}}
public class ImpComparableWrong {

public static void main(String[] args) {
    TreeSet<Integer> i = new TreeSet<Integer>();
    TreeSet<Dog> d = new TreeSet<Dog>();
    d.add(new Dog(1));
    d.add(new Dog(2));
    d.add(new Dog(1));

    i.add(1);
    i.add(2);
    i.add(3);

    System.out.println(d.size() + &quot; &quot; + i.size());
}}

输出为:
run:
Exception in thread “main” java.lang.ClassCastException: Dog cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at java.util.TreeSet.add(TreeSet.java:238)
at ImpComparableWrong.main(ImpComparableWrong.java:17)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
原因是Class Dog需要实现Comparable,以便TreeSet(保持其元素排序)能够包含Dog对象。无法将添加的对象与集合中当前的元素进行比较,add(Object)调用将引发ClassCastException。为了使对象具有可比性,用户定义的类必须实现Comparable接口。
2.为TreeSet实现Comparable的解决方案
以下是已更正的代码(实现Comparable):
import java.util.TreeSet;
class Dog implements Comparable {

int size;

Dog(int s) {
    size = s;
}

public int compareTo(Dog o) {
    return size - o.size;
}}

public class ImpComparable {

public static void main(String[] args) {

    TreeSet<Dog> d = new TreeSet<Dog>();
    d.add(new Dog(1));
    d.add(new Dog(2));
    d.add(new Dog(1));

    TreeSet<Integer> i = new TreeSet<Integer>();
    i.add(1);
    i.add(2);
    i.add(3);

    System.out.println(d.size() + &quot; &quot; + i.size());
}}

输出:
run:
2 3
BUILD SUCCESSFUL (total time: 0 seconds)

3.比较器与可比
检查比较并找出何时使用。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值