我遇到一个问题,我需要创建(1)一个单词的链接列表和(2)每个单词一个单独的链表用于存储该单词的地址(在这种情况下,你可以想象它的网址就像一个搜索引擎:在特定网址中标识/包含关键字。
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中),因此System.out.println(engine)
应该给我输出:
A: a.com
接下来,如果我engine.insert("A", "b.com")
新单词节点不能链接到单词节点的链接列表,现在“b.com”应该链接到A的url链表中。输出应为:
A: a.com b.com
然而,当我尝试engine.insert("B", "c.com")
时,我想要的是一个新的单词节点应该链接(因为只有一个单词节点(属于A的))到单词节点的链表( s)现在这个单词节点的“mid”附加到本地url节点(unode)引用变量,输出应该是:
A: a.com b.com
B: c.com
但是当我运行它时,这是输出:
A: a.com b.com
B: a.com b.com c.com
我在这里做错了什么?我认为我的逻辑很好。这是因为toString()
方法吗?我需要一些认真的帮助。任何帮助将不胜感激。谢谢!
答案 0 :(得分:3)
您没有在外部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;
}
答案 1 :(得分:2)
除了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
的内容。