2015-04-25 37 views
3

我有一些對象,我們只需將它們稱爲Person對象。我還有一些其他對象,我們稱之爲關係對象。如何在Java中存儲基於兩個對象的值?

我想能夠在兩個Person對象之間分配一個Relationship對象,但我不確定這是一個好方法。

我在考慮給每個Person對象一個ID,然後使用Person對象ID作爲關鍵值創建一個Relationship對象的二維數組。

我不確定這是否是最好的方法,因爲在兩個Person對象之間沒有關係的地方,數組會有很多空值。

+1

你可以讓每個人包括所有的關係它在列表如果你想將它們存儲在外部,您可以使用嵌套的地圖:

是過去有人貼出了基本樹類結構上SO (或番石榴的桌子)。 –

+0

如果我理解正確,你想讓兩個人知道他們之間是否存在關係。創建一個包含兩個人或兩個人ID的Key類,並使用Map 。確保正確實現hashCode()和equals()。 –

+0

如果您打算使用第三方庫,那麼我**高度推薦Neo4j。它使用圖來映射這種類型的東西,並且可以使用它的查詢語言來有效地推理結構。 –

回答

1

您描述的是三個實例:兩個Person實例和一個Relationship實例。

最直接的方法是,在Person類,允許存在一個Relationship實例,以及連接到有線了Relationship這兩個Person S之間的關係。

class Person { 
    Relationship relationship; 

    public void createRelationship(Person person) { 
     relationship = new Relationship(this, person); 
    } 
} 

如果你想要的Relationship實例後面要跟一個集合或數組中,你可以修改只返回一個新Relationship作爲兩個Person S中的結果。

class Relationship { 

    public static Relationship createRelationshipFrom(Person firstPerson, Person secondPerson) { 
     return new Relationship(firstPerson, secondPerson); 
    } 
} 
+0

「如果您希望將Relationship實例保存在一個集合或數組中,您可以修改它以僅返回一個新的關係作爲兩個人的結果。」 是的,這是我問的。我最好怎麼做?一個2D數組,其中的鍵是一個Person ID?是否有某種Java對象可以使用接受兩個對象作爲關鍵字? – user11406

+0

你在這裏過於複雜。所有你需要做的就是存儲新的'Relationship'實例作爲調用上述方法的結果。如果你想看看'Person'是否在特定的'Relationship'中,你必須爲'Person'定義一個'equals'方法,並在'Relationship'中暴露'inRelationship(Person person)'方法。 – Makoto

+0

這是糟糕的OOP風格!兩個班級緊密聯繫在一起。 'Person'類不需要'Relationship'成員。只有'Relationship'應該保留兩個對'Person'的引用。 – mike

0

在自然界,一個人可以是一個關係的一部分,但一個關係不能成爲一個人的一部分。因此,將Relationship作爲Person的成員是不合意的。這樣的設置防止Person從具有一個以上Relationship :),也防止Person從沒有Relationship :(

如果我們可以定義一個Relationship爲2人之間,只有2人,那麼一個可能的設置如果Relationship可以在3人以上:),那麼單個List<Person>成員可能會更有幫助。

我希望能夠分配關係對象之間有兩個Person對象

如果你想離散徵求約會建議,你來錯了地方。

編輯:

如果您想獲得任何給定的兩個人蔘與了Relationship,像這樣創建

public Relationship find(List<Relationship> relationships, Person person1, Person person2) { 
    for (Relationship relationship : relationships) { 
     if (relationship.getPerson1().equals(person1) && relationship.getPerson2().equals(person2) { 
      return relationship; 
     } 
     if (relationship.getPerson1().equals(person2) && relationship.getPerson2().equals(person1) { 
      return relationship; 
     } 
    } 
} 

的方法。如果性能是一個問題,使用Set<Relationship>和覆蓋equals()hashCode()關係方法,以便兩個包含相同人員的對象將被視爲相同。那麼你可以做到這一點

Set<Relationship> relationships = new HashSet<Relationship>(); 
// populate relationships 

Relationship delegate = new Relationship(person1, person2); 
int hasRelationship = relationships.contains(delegate); 
+0

感謝您的回覆。我瞭解如何存儲關係我只是困惑於如何在創建後最好地檢索它。我會使用人物的二維數組還是其他東西?關鍵是什麼,對象? – user11406

+0

@ user11406這取決於。你想如何檢索它?你是否想要獲得一個'Person'參與的'Relationship'列表? 'Map >'會起作用。你想列出參與所有關係的人嗎?只需使用'List '。這完全取決於你如何計劃使用這些信息。 – pathfinderelite

+0

也沒有。我有兩個人,我想得到他們的關係。我想要的東西像relationship = relationships [person1] [person2]; 我只是懷疑使用二維數組將是一個很好的方法,我甚至不知道如何創建一個二維ArrayList。另外,即使我這樣做,我需要爲每個人分配一個ID用作密鑰。 – user11406

2

@ Makoto的一個好主意。或者,對我來說聽起來更自然的一點是讓Relationship對象持有兩個Person對象,例如作爲構造函數參數。然後,您只需要跟蹤關係對象,因爲他們將知道關於它們兩部分的人。

class Relationship { 
Person firstPerson; 
Person secondPerson; 

    public Relationship(Person firstPerson, Person secondPerson) { 
    this.firstPerson = firstPerson; 
    this.secondPerson = secondPerson; 
} 

或者您可以使用一個公共的方法來傳遞參考Person對象,如果你不希望他們通過構造函數傳遞信息:

public void setPersons(Person firstPerson, Person secondPerson) { 
    this.firstPerson = firstPerson; 
    this.secondPerson = secondPerson; 
} 
0

你需要的是一個實現在Java中爲Tree,其中節點是Person對象,並且邊(連接兩個節點的線)是連接。這是您需要的最有效的數據模型。 。Java tree data-structure?

相關問題