2016-09-21 151 views
-3

此對象是一包口香糖。每種口香糖都是獨一無二的。我們建立了一個可容納12顆牙齦的包。我們用新的口香糖填充包裝。我們必須檢查包裝,看看這種口香糖是否已經裝入包裝中。包裝中的每個口香糖必須是獨特的。Java嵌套循環防止重複

public PackOfGum() 
{ 
    pack = new Gum[12]; 
    // Successfully populate pack with gum 
    for (int i=0; i<12; i++) { 
    pack[i] = new Gum(); 


    // Failure preventing duplicate gums. Idea is to look in the pack 
    // at all of the gums that came before this one, and see if this one 
    // matches any of them. While yes and it is a duplicate, then choose 
    // a new gum. 
    for (j=0; j<i; j++) { 
     while (pack[i] == pack[j]) { 
     pack[i] = new Gum(); 
     } 
    } 
    } 
} 

我未能正確地檢查所有以前的牙齦,並將它們與當前口香糖比較。這應該如何正確完成?

+2

我不知道我是否正確理解您的問題。但是如果你只是想存儲一個非重複的槍支集合,那麼你可以使用java.util.Set來存儲它。您需要在Gum類中實現equals方法來定義相等條件。 –

+0

一個問題:你如何比較膠質物體?使用其內存地址或其值? – MaxZoom

+0

口香糖「種類」的定義是什麼?您現在正在比較兩個Gum引用是否指向相同的Gum對象實例。鑑於你正在爲數組中的每個元素創建一個新的Gum實例,它總是會有所不同。 –

回答

1

您需要在Gum class中提供您自己的equals()實施。

@Override 
public boolean equals(Object other) 
{ 
    if (!(other instanceof GumClass)) 
    { 
     return false; 
    } 
    GumClass that = (GumClass) other; 
    // Custom equality check here. 
    return this.field1.equals(that.field1) 
    && this.field2.equals(that.field2); 
} 

如果您的對象有任何機會在哈希表中使用,您還應該覆蓋hashCode()。一個合理的實現將是該對象的字段的哈希碼的東西,如結合:

@Override 
public int hashCode() 
{ 
    int hashCode = 1; 
    hashCode = hashCode * 37 + this.field1.hashCode(); 
    hashCode = hashCode * 37 + this.field2.hashCode(); 
    return hashCode; 
} 

this question,詳細瞭解實施的哈希函數

+1

@Hector實現'hashCode'而不實現'equals'不會破壞合約。雖然它有點傻。 – ajb

0

有許多的東西從你的問題遺漏。首先,由於您沒有給我們提供Gum課程,所以我無法弄清楚每個new Gum()將如何創建一個獨特的GumGum是否有某種flavor實例變量被初始化爲隨機味道?也許,但你沒有給我們這些信息。另外,正如其他答案指出的那樣,使用==來比較牙齦是行不通的。假設每個Gum都有一個flavor,您需要提供一個equals()方法,該方法比較flavor字段的相等性(和hashCode函數,該函數返回具有相同風格的任何Gum對象的相同散列值)。

我最想指出的問題是你的循環邏輯中的缺陷。您正在瀏覽一組現有的Gum對象,並且每當發現重複對象時,都會創建一個新的Gum。這不會完成工作。假設你的數組由A,B,C,D,E組成。假設new Gum()生成一個口香糖C的口香糖。你通過這個數組,你發現它匹配pack[2]。所以,你生成另一個Gum - 你的隨機Gum發電機產生一個Gum香味B.現在你的循環不會找到它,因爲你仍然向前通過陣列,你只會看D和E.所以你最終會在你的包裏有一個副本。

那麼你會怎麼做?一種選擇是,無論何時發現重複,都會生成一個新的Gum,然後在數組的開頭重新開始。這是一個非常緩慢的方式來做事,但它會起作用。一些更好的選擇:

  • 維護所有Gum的那些已經在包的Set。現在,不要通過數組來查看Gum是否是重複的,只需查看該集合是否包含它即可。如果你使用HashSet,你可以在恆定的時間內完成這個測試,而不是搜索數組。 (如果您使用的是HashSet,則您肯定需要使用hashCode功能。)

  • 保留所有尚未使用的Gum口味的數組。如果您從12種口味開始,那麼第一個new Gum()將使用從0到11的隨機數,第二個將使用從0到10的隨機數,從0到9的第三個,等等。每次,您將使用數組和隨機數來選擇正確的風味,然後進行交換以將該風味移動到數組的末尾。例如,如果數組開始出現A,B,C,D,E,F,G,H,I,J,K,L和你的隨機數是4,那就是E的味道,然後你用L替換你的數組A,B,C,D,L,F,G,H,I,J,K,E。下一個隨機數只會從0到11,所以它不會選擇E.無論它選擇什麼,都會用K替換。等等。