簡體   English   中英

在Java中,如何檢查對象是否在鏈表中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM