Java:比较/排序任意对象

无论如何,我可以为JVM中的所有对象定义一个序列/顺序,这样对于任何两个不同的对象o1或o2,有一个明确定义的规则,表示o1> o2或o2> o1和o1 == o2 if和only如果它们是同一个对象? identityHashCode()比较将是一个很好的候选者,如果有无碰撞保证(没有)。 出生时间也会起作用 - 如果我能以某种方式获得它。 有任何想法吗? 谢谢!     
已邀请:
您需要做的就是定义任意稳定的排序。 (你的“对象出生时间”是 一个这样的想法,但我不认为它是存储的)。 方法一: 对于具有相同确切类型的任何两个对象,您可以通过比较来定义这样的排序 他们各自的领域。如果所有字段都相同,则对象相等;如果不, 某些字段f不同,您可以根据基础类型定义排序。 如果您有两个具有不同类型的对象,只需使用类型名称来定义顺序;该 名字按字典缩小的名称是“小于”。您可以实现每种类型的比较 (可能是很多工作)或者你可以实现一个通用比较使用反射 枚举字段名称和类型(以启用特定于类型的比较),尽管这可能 很慢。 方法2: 无论何时调用比较器,都要缓存线性阵列中尚未遇到的任何对象。 这样比较的任何对象现在在数组中都有一个索引位置; o1< o2如果索引(o1)<指数(O 2)。 您可能需要一个哈希表来将指定的索引位置与缓存的对象相关联。 方法3: 如果您正在处理对象的特定子集,并且有规范 生成树,然后对生成树的每个边缘进行编号,使子节点成为弧形 有独特的数字。然后o1< o2如果从生成树的根路径到o1, 小于o2的路径。     
如果您能够维护自己的对象存储库,则可以使用
WeakHashMap<Object, Long>
来维护自己的序列ID。     
你需要实现
Comparable<YourObject>
接口和
compareTo(YourObject obj)
方法。 compareTo(..)方法的契约是当此对象小于作为参数传递的对象时返回-1(-ve number),当它们相等时返回0,当此对象更大时返回+1(+ ve数)比其他对象。您可以将比较实现为使用您喜欢的任何字段。 使用Collections.sort()或任何list.sort()将使用此比较器对列表进行排序。 希望这可以帮助!     
如果您的对象属于同一类型,则可以在构造函数中记住它们的创建编号:
class A {
    private static long count = 0;
    private long objNumber;
    public A() {
        synchronized(A.class) {
            objNumber = count;
            count++;
        }
    }
}
    
Object.toString()
方法应该以格式为不同的对象返回不同的值:
getClass().getName() + '@' + Integer.toHexString(hashCode())
那么你可以先按字母顺序比较getClass()。getName(),然后是hashCode()吗?     

要回复问题请先登录注册