簡體   English   中英

Java:比較/排序任意對象

[英]Java: Compare/sort arbitrary objects

無論如何,我可以為JVM中的所有對象定義一個序列/順序,這樣對於任何兩個不同的對象o1或o2,有一個明確定義的規則,即o1> o2或o2> o1和o1 == o2 if和only如果它們是同一個對象?

identityHashCode()比較將是一個很好的候選者,如果有無碰撞保證(沒有)。

出生時間也會起作用 - 如果我能以某種方式獲得它。

有任何想法嗎?

謝謝!

如果您可以維護自己的對象存儲庫,則可以使用WeakHashMap<Object, Long>來維護自己的序列ID。

您需要做的就是定義任意穩定的排序。 (你的“對象出生時間”就是這樣一個想法,但我不認為它是存儲的)。

方法1:對於具有相同確切類型的任何兩個對象,您可以通過比較它們各自的字段來定義這樣的排序。 如果所有字段都相同,則對象相等; 如果不是,則某些字段f不同,您可以根據基礎類型定義排序。 如果您有兩個具有不同類型的對象,只需使用類型名稱來定義順序; 名字按字典順序縮小的那個是“小於”。 您可以實現每種類型的比較(可能需要大量工作),或者您可以實現泛型比較使用反射來枚舉字段名稱和類型(以啟用特定於類型的比較),盡管這可能非常慢。

方法2:每次調用比較器時,都要緩存線性數組中尚未遇到的任何對象。 這樣比較的任何對象現在在數組中都有一個索引位置; 如果索引(o1)<索引(o2),o1 <o2。 您可能需要一個哈希表來將指定的索引位置與緩存的對象相關聯。

方法3:如果您正在處理對象的特定子集,並且存在規范的生成樹,則對生成樹的每個邊進行編號,以使子弧具有唯一的數字。 然后o1 <o2如果從生成樹的根路徑到o1的路徑小於o2的路徑。

您需要實現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()嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM