Java:比较/排序任意对象

时间:2011-04-11 07:28:09

标签: java comparison hashcode treemap comparable

无论如何,我可以为JVM中的所有对象定义序列/顺序,以便对于任何两个不同的对象o1或o2,有一个明确定义的规则,表示o1> o2或o2> o1和o1 == o2当且仅当它们是同一个对象时?

identityHashCode()比较将是一个很好的候选者,如果有无碰撞保证(没有)。

出生时间也会起作用 - 如果我能以某种方式获得它。

有什么想法吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

如果您可以维护自己的对象存储库,则可以使用WeakHashMap<Object, Long>来维护自己的序列ID。

答案 1 :(得分:2)

您需要做的就是定义任意稳定的顺序。 (你的“对象出生时间”是 一个这样的想法,但我不认为它是存储的。)

方法一: 对于具有相同确切类型的任何两个对象,您可以通过比较来定义这样的排序 他们各自的领域。如果所有字段都相同,则对象相等;如果不, 某些字段f不同,您可以根据基础类型定义排序。 如果您有两个具有不同类型的对象,只需使用类型名称来定义顺序;该 名字按字典缩小的名称是“小于”。您可以实现每种类型的比较 (可能是很多工作)或者你可以实现一个通用比较使用反射 枚举字段名称和类型(以启用特定于类型的比较),尽管这可能 很慢。

方法2: 无论何时调用比较器,都要缓存线性阵列中尚未遇到的任何对象。 这样比较的任何对象现在在数组中都有一个索引位置; o1&lt; o2如果索引(o1)&lt;指数(O 2)。 您可能需要一个哈希表来将指定的索引位置与缓存的对象相关联。

方法3: 如果您正在处理对象的特定子集,并且有规范 生成树,然后对生成树的每个边缘进行编号,使子节点成为弧形 有独特的数字。然后o1&lt; o2如果从生成树的根路径到o1, 小于o2的路径。

答案 2 :(得分:1)

您需要实现Comparable<YourObject>接口和compareTo(YourObject obj)方法。 compareTo(..)方法的契约是当此对象小于作为参数传递的对象时返回-1(-ve number),当它们相等时返回0,当此对象更大时返回+1(+ ve数)比其他对象。您可以将比较用于使用您喜欢的任何字段。

使用Collections.sort()或任何list.sort()将使用此比较器对列表进行排序。

希望这有帮助!

答案 3 :(得分:0)

如果您的对象属于同一类型,则可以在构造函数中记住它们的创建编号:

class A {
    private static long count = 0;
    private long objNumber;
    public A() {
        synchronized(A.class) {
            objNumber = count;
            count++;
        }
    }
}

答案 4 :(得分:0)

Object.toString()方法应该以格式为不同的对象返回不同的值:

getClass().getName() + '@' + Integer.toHexString(hashCode())

那么你可以先按字母顺序比较getClass()。getName(),然后是hashCode()吗?