2017-09-22 8 views
2

私は、(1)リンクされた単語リストを作成する必要があり、(2)各単語ごとに、その単語のアドレスを格納するための別のリンクリストこの場合は、検索エンジンのように想像することができます:特定のURLにキーワードが含まれています)。単語とアドレスをJavaで保存するための単独リンクリスト

私は出力がこのような何かになりたい
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」を作成したとしましょう、それは史上初のことで(unodeに)「a.com」をのURL engine.insert("A", "a.com)が、そうSystem.out.println(engine)は私に出力与える必要があります:私はengine.insert("A", "b.com")を行う場合は、新しいワードノードは、現在の単語ノード(S)とのリンクリストにリンクされてはならない、

A: a.com 

次の「b.com」でなければなりませんAのURLのリンクリストにリンクされています。出力は次のようになります。しかし

A: a.com b.com 

、私はengine.insert("B", "c.com")をしようとすると、私が欲しいのは(Aさんである1つのワードのみのノード()がありますように)新しい単語ノードがリンクにリンクされなければならないということですワードノード(複数可)となりました。この言葉ノードの「中期」のリストには、ローカルURLノード(unode)参照変数に取り付けられており、出力は次のようになります。

A: a.com b.com 

B: c.com 

しかし、私はこれを実行すると、これが出力されます:

A: a.com b.com 

B: a.com b.com c.com 

私はここで何が間違っていますか?私の論理は大丈夫だと思います。これはtoString()メソッドのためですか?私は真剣な助けが必要です。どんな助けでも大歓迎です。ありがとう!

答えて

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; 
} 

私がコメントした2番目の最後の行を見てください。それが正しく動作するように挿入する必要があります。それ以外の場合は、UNodeの内容を時間の経過と共に追加するだけです。

+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; 
} 
+0

ありがとうございます。今それは最終的に動作します! :) –

関連する問題