当前位置:  开发笔记 > 编程语言 > 正文

Java类的比较器?

如何解决《Java类的比较器?》经验,为你挑选了1个好方法。

我想比较两个Java类.

class ClassComparator implements Comparator {
    @Override
    public int compare(Class arg0, Class arg1) {
        return ....;
    }
}

我可以只比较类名,但我希望父类比从它们派生的类"更小".而且我希望这种不那么关系能够传递并适用于任何两个类.(老实说,在我真正的问题中,一个类总是另一个类的超类,但我想要一些通用案例代码,因为理论上这可以改变.)

也许这已经完成,有人可以共享代码片段?

我想到的是:如果没有一个类派生自另一个类,找到它们从共同祖先派生的两个超类,并比较它们的名字.(嗯,如果任何对象类比任何接口都大,它甚至可以支持接口.)



1> Orest Savcha..:

您还可以将不在一个层次结构中的类与它们的深度和远离Object类的类进行比较.

    class ClassComparator implements Comparator {
    @Override
    public int compare(Class arg0, Class arg1) {
        boolean arg0assignable = arg0.isAssignableFrom(arg1);
        boolean arg1assignable = arg1.isAssignableFrom(arg0);
        if (arg0assignable == arg1assignable && arg0assignable) {
            return 0;
        } else if (arg0assignable) {
            return -1;
        } else if (arg1assignable){
            return 1;
        } else {
            return compareByDistanceToObject(arg0, arg1);
        }
    }

    private int compareByDistanceToObject(Class arg0, Class arg1) {
        int distanceToObject0 = getDistance(arg0);
        int distanceToObject1 = getDistance(arg1);
        if (distanceToObject0 == distanceToObject1) {
            return 0;
        } else if (distanceToObject0 < distanceToObject1) {
            return -1;
        } else {
            return 1;
        }
    }

    private int getDistance(Class clazz) {
        if (clazz == Object.class) {
            return 0;
        }
        return 1 + getDistance(clazz.getSuperclass());
    }


这很好,可以通过类似`.thenComparing((a,b) - > a.getName().compareTo(b.getName()))使用类名称传送到第二个比较器.
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有