Java:比较/排序任意对象

RAY*_*RAY 6 java comparison hashcode treemap comparable

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

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

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

有任何想法吗?

谢谢!

Ira*_*ter 2

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

方法1:对于任何两个完全相同类型的对象,您可以通过比较它们各自的字段来定义这样的排序。如果所有字段都相同,则对象相等;如果不是,则某些字段 f 不同,您可以根据基础类型定义排序。如果您有两个不同类型的对象,只需使用类型名称来定义顺序即可;按字典顺序排列的名称较小的为“小于”。您可以实现每个类型的比较(可能需要大量工作),或者您可以实现一个通用比较,使用反射来枚举字段名称和类型(以启用特定于类型的比较),尽管这可能非常慢。

方法2:任何时候调用比较器时,都会缓存线性数组中尚未遇到的任何对象。这样比较的任何对象现在在数组中都有一个索引位置;如果索引 (o1) < 索引 (o2),则 o1 < o2。您可能需要一个哈希表将分配的索引位置与缓存的对象关联起来。

方法 3:如果您正在处理对象的特定子集,并且存在规范生成树,则对生成树的每个边进行编号,以便子弧具有唯一的编号。如果从生成树根到 o1 的路径小于到 o2 的路径,则 o1 < o2。