2013-07-08 56 views
2

下面是我的課。 insertSymbol方法應該將對象添加到鏈接列表中,然後將其添加到散列表中。但是當我打印哈希表的內容時,它有兩個條目。我試圖通過使用「if(temp.contains(value)){return;}」來解決這個問題,但它不起作用。我讀過我需要在幾個地方使用@override。任何人都可以幫助我知道如何以及在何處使用覆蓋?謝謝!在Java中,如何檢查對象是否在鏈接列表中?

import java.util.*; 

public class Semantic { 
    String currentScope; 
    Stack theStack = new Stack(); 
    HashMap<String, LinkedList> SymbolTable= new HashMap<String, LinkedList>(); 


    public void insertSymbol(String key, SymbolTableItem value){ 
     LinkedList<SymbolTableItem> temp = new LinkedList<SymbolTableItem>(); 
     if(SymbolTable.get(key) == null){ 
      temp.addLast(value); 
      SymbolTable.put(key, temp); 
     }else{ 
      temp = SymbolTable.get(key); 
      if(temp.contains(value)){ 
       return; 
      }else{ 
       temp.addLast(value); 
       SymbolTable.put(key, temp); 
      } 
     } 
    } 

    public String printValues(){ 
     return SymbolTable.toString(); 
    } 

    public boolean isBoolean(){ 
     return true; 
    } 

    public boolean isTypeMatching(){ 
     return true; 
    } 

    public void stackPush(String theString){ 
     theStack.add(theString); 
    } 

} 
+0

對於諸如「symbolTable」的變量,您應該使用小寫字母,因爲我們都習慣以這種方式讀取Java。它的標準慣例。 –

+0

順便說一句,你可以做什麼,而不是'map.get(key)!= null'是使用'map.containsKey(key)' –

+0

謝謝你的洞察力。學習這些東西很好。一些標識符,例如SymbolTable,由教授給出,所以我嘗試使用它們。 – bstrong

回答

2

當你添加一個新的值具有相同鍵你不需要二號線:

temp.addLast(value); 
SymbolTable.put(key, temp); // <-- Not needed. Its already in there. 

讓我來解釋的東西,@ErikPragt暗指對於此代碼:

if(temp.contains(value)){ 

你認爲這意味着什麼?

如果你的Javadoc LinkedList看,你會發現,如果在列表中的值不爲空,它使用value對象的equals()方法,看看列表元素是一樣的。

這意味着,您的情況是,您的類SymbolTableItem需要一個equals()方法來比較這些對象中的兩個,看它們是否相同,無論您的情況如何。

讓我們假設實例在名稱相同的情況下將被視爲相同。你需要這樣的方法在「SymbolTableItem`類:

@Overrides 
public boolean equals(Object that) { 
    if (that == null) { 
     return false; 
    } 
    if (this.getName() == null) { 
     return that.getName() == null; 
    } 
    return this.getName().equals(that.getName()); 
} 

它這取決於多個領域,平等會相應地更加複雜。

注意:還有一件事。如果您爲類添加equals方法,那麼添加hashcode()方法也是很好的編程習慣。規則是如果兩個實例相同,它們應該具有相同的哈希碼,如果不相等,則它們不必是不同的哈希碼,但如果它們確實是非常好的。

如果您使用現有的代碼,只使用equals,則不需要嚴格的哈希碼。但是,如果您不添加hashcode,那麼總有一天它可能會成爲問題。也許今天。

如果名字很重要,你的散列碼可以返回:this.getName().hashcode()

同樣,如果有更多的事情要比較以判斷它們是否相等,散列碼方法將更加複雜。

+0

這是一個很好的評論,但這不是他的問題的答案,對吧? –

+0

他的問題是在哪裏使用@overrides。我想沒有人會回答這個問題,因爲它提供更正的公平遊戲。 –

+0

我猜@overrides可能是等於和hashcode方法。不是真的需要,但是當選擇2時,它可能會有用。 –

6

您有多個選項。你至少需要爲你的類添加一個等號(以及一個hashcode)方法。

但是,如果您希望您的收藏只包含唯一物品,爲什麼不使用Set呢?

如果你仍然想使用List,你可以使用你當前的方法,它只是一個Set的特性是一個Set中的所有項都是唯一的,所以Set可能在這裏有意義。

添加equals方法可以很容易完成。 Apache Equalsbuilder是一個很好的方法。

+0

如果你想保持列表,並不知道如何添加平等/散列方法,這裏有一個類似的問題:http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – Brinnis

+0

選項列表前的最後一句僅指第一個選項。這有點令人困惑。不值得改變你的答案。 –

相關問題