[英]JAVA Linked List Confused on why I can't check a variable against an node in the Linked List?
[英]In Java how can I check if an object is in a linked list?
以下是我的課。 insertSymbol方法應該將一個對象添加到鏈表中,然后將其添加到哈希表中。 但是當我打印哈希表的內容時,它有兩個條目。 我試圖通過使用“if(temp.contains(value)){return;}”來糾正這個問題,但它無效。 我讀到我需要在幾個地方使用@override。 誰能幫助我知道如何以及在哪里使用覆蓋? 謝謝!
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);
}
}
你有多種選擇。 您至少需要為您的類添加一個equals(以及一個hashcode)方法。
但是,如果您希望您的集合僅包含唯一項目,為什么不使用Set ?
如果你仍想使用List,你可以使用當前的方法,只是Set的特性是Set中的所有項都是唯一的,所以Set可能在這里有意義。
添加equals方法非常容易。 Apache Equalsbuilder是一個很好的方法。
使用相同的鍵添加新值時,不需要第二行:
temp.addLast(value);
SymbolTable.put(key, temp); // <-- Not needed. Its already in there.
讓我解釋一下@ErikPragt對此代碼的暗示:
if(temp.contains(value)){
你認為這意味着什么?
如果查看LinkedList
的javadocs,您會發現如果列表中的值為非null,則它使用value
對象上的equals()
方法來查看list元素是否相同。
在您的情況下,這意味着您的類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()
。
同樣,如果有更多的事情需要比較來判斷它們是否相等,那么哈希碼方法將更加復雜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.