2010-09-03 46 views
1

一般來說,您能否提出一種方法,讓我測試對象以確保它們相似。如何檢測數據的「相似性」

如果對象內容超過'n%'的價值是相同的,那麼接受這些對象是相似的。

其他然後一個蠻力,有沒有任何圖書館我可以利用?

感謝

+3

這太籠統了。請提供您計劃執行的其他信息。 – 2010-09-03 16:46:29

+1

什麼樣的'對象/數據':任意的java類實例?三維形狀? – ChrisW 2010-09-03 19:00:47

+0

根據javap,字符串有4個實例成員 - 值,偏移量,計數,散列。 (「Hello World」,0,5,-1)和(「Good Bye World」,0,5,-1)在75%的水平相似。讓NotString是一個實現CharSequence的類,它沒有這4個實例成員。 String「Hello World」和NotString「Hello World」之間的相似性關係是什麼? – emory 2010-09-04 01:30:52

回答

0

一兩件事你可以嘗試一種編碼對象然後比較結果......特別是我和JSON做到了這一點。爲了檢測對象是否完全匹配,這很簡單。

1

這隻能根據具體情況進行。如果我真的需要這個功能,我會定義一個接口:

public interface Similar<Entity> { 
boolean isSimilar(Entity other); 
} 

每一個實現類可以定義它的意思是「相似」到另一個實例。事情要記住的是,你會記住克隆同樣的問題:淺拷貝VS深拷貝等

樸素實現人:

public class Person implements Similar<Person> { 
    private String firstName; 
    private String lastName; 

    public String getLastName() { 
     return lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public boolean isSimilar(Person other) { 
     if (other != null) { 
      if (lastName.equalsIgnoreCase(other.getLastName()) 
       || (firstName.equalsIgnoreCase(other.getFirstName()))) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 
3

作爲一個起點,看看在所謂的Levenshtein distance,看看它是否與你的使用有關?

1

我相信你可以找到一個很好的解決方案,如果你專注於你的具體問題的細節。我在一般情況下考慮的唯一「合理」解決方案是基於reflection:掃描數據成員並遞歸地查找相應成員對的相似性。

但是,這個想法存在很多問題,所以我認爲它不可行。其中:

1)權重的概念應該定義好,以便能夠返回相似性百分比。

2)如何處理只屬於其中一個對象的數據成員?在比較類A的實例和後代類B的實例時,這經常發生。

3)也許是最大的問題:對象內部結構與其抽象數據表示之間的映射不是一個內射函數。例如,由於表格重新分配的不同歷史,表示相同映射的兩個hashmaps可能具有不同的內部結構。

0

您可以實現Comparable接口併爲比較類的實例定義自己的「邏輯」。

正如前面提到的,對於文本相似性,您可以使用距離計算算法,您可以在SimMetrics庫(http://www.dcs.shef.ac.uk/~sam/simmetrics.html)中找到它們。

另一種比較對象的方法是通過比較對象哈希碼(在重寫Object類的hashCode()方法之後) - 請注意,這是您要查找的內容。