用于在Java

时间:2017-09-22 08:42:31

标签: java search linked-list

我遇到一个问题,我需要创建(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()方法吗?我需要一些认真的帮助。任何帮助将不胜感激。谢谢!

2 个答案:

答案 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的内容。