[英]Singly linked list for storing word and addresses in Java
我遇到一個問題,我需要創建(1)單詞的鏈接列表,並且(2)為每個單詞創建一個單獨的鏈接列表,用於存儲該單詞的地址(在這種情況下,URLs就像搜索引擎一樣:在特定的網址中標識/包含一個關鍵字)。
public class SearchEngine {
WNode whead;
public void insert(String word, String url) {
WNode wnode = new WNode(word);
UNode unode = new UNode(url);
if (whead == null) {
whead = wnode;
wnode.mid = unode;
}
else {
WNode wtemp = whead;
while (wtemp.next != null && !wtemp.word.equals(wnode.word)) {
wtemp = wtemp.next;
}
if (wtemp.word.equals(wnode.word)) {
UNode utemp = wtemp.mid;
while (utemp.next != null) {
utemp = utemp.next;
}
utemp.next = unode;
wnode = null;
}
else {
wtemp.next = wnode;
wnode.mid = unode;
}
}
}
public String toString() {
WNode wordTemp = whead;
String str = "";
String str1 = "";
while (wordTemp != null) {
UNode urlTemp = wordTemp.mid;
while (urlTemp != null) {
str += urlTemp.url + " ";
urlTemp = urlTemp.next;
}
str1 += wordTemp.word + ": " + str + "\n";
wordTemp = wordTemp.next;
}
return str1;
}
public static void main(String[] args) {
SearchEngine engine = new SearchEngine();
engine.insert("A", "a.com");
engine.insert("A", "b.com");
engine.insert("B", "c.com");
System.out.println(engine);
}
}
class WNode {
String word;
UNode mid;
WNode next;
WNode(String word) {
this.word = word;
}
}
class UNode {
String url;
UNode next;
UNode(String url) {
this.url = url;
}
}
我希望輸出是這樣的:假設我創建了第一個單詞節點(wnode)“ A”,並且通過執行engine.insert("A", "a.com)
它是第一個URL“ a.com”(在unode中) engine.insert("A", "a.com)
,因此System.out.println(engine)
應該給我輸出:
A: a.com
接下來,如果我執行engine.insert("A", "b.com")
,則engine.insert("A", "b.com")
將新的單詞節點鏈接到單詞節點的鏈接列表,現在應將“ b.com”鏈接到A的網址中鏈表。 輸出應為:
A: a.com b.com
但是,當我嘗試執行engine.insert("B", "c.com")
,我想要的是將一個新的單詞節點鏈接到(因為只有一個單詞節點(屬於A的單詞))字節點的鏈表,現在該字節點的“中間”已附加到本地url節點(unode)參考變量,輸出應為:
A: a.com b.com
B: c.com
但是當我運行它時,這是輸出:
A: a.com b.com
B: a.com b.com c.com
我在這里做錯了什么? 我認為我的邏輯還可以。 這是因為toString()
方法嗎? 我需要一些認真的幫助。 任何幫助將不勝感激。 謝謝!
您沒有在外部while循環中重置str
,這會導致它將URL繼續進行下一次迭代。 請參見下面的固定toString()
:
public String toString() {
WNode wordTemp = whead;
String str1 = "";
while (wordTemp != null) {
String str = "";
UNode urlTemp = wordTemp.mid;
while (urlTemp != null) {
str += urlTemp.url + " ";
urlTemp = urlTemp.next;
}
str1 += wordTemp.word + ": " + str + "\n";
wordTemp = wordTemp.next;
}
return str1;
}
除了toString()
方法外,您的實現邏輯還可以。 完成一個WNode
,您必須清空包含相應UNode
內容的字符串。
public String toString() {
WNode wordTemp = whead;
String str1 = "";
while (wordTemp != null) {
String str = "";
UNode urlTemp = wordTemp.mid;
while (urlTemp != null) {
str += urlTemp.url + " ";
urlTemp = urlTemp.next;
}
str1 += wordTemp.word + ": " + str + "\n";
wordTemp = wordTemp.next;
str = ""; //empty the string here
}
return str1;
}
看看第二行,我在這里評論。 這是您必須插入才能使其正常工作的內容。 否則,您將隨時間添加所有UNode
的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.