2017-09-22 4 views
2

J'ai un problème dans lequel je dois créer (1) une liste de mots liés et (2) pour chaque mot une liste chaînée séparée pour stocker les adresses de ce mot (urls dans ce cas, comme vous pouvez l'imaginer comme un moteur de recherche: un mot-clé est identifié/contenu dans des URL spécifiques).Liste de liens simples pour stocker des mots et des adresses en 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; 
} 

} 

Je veux que la sortie soit quelque chose comme ceci: Disons que je créé un premier noeud de mot (wnode) « A », et il est d'abord url jamais « a.com » (en unode) en faisant engine.insert("A", "a.com), donc System.out.println(engine) devrait me donner la sortie:

A: a.com 

Ensuite, si je engine.insert("A", "b.com") un nouveau nœud de mot NE dOIT PAS être lié à la liste chaînée du noeud mot (s) et maintenant « b.com » devrait être lié dans la liste liée de l'URL de A. La sortie doit être:

A: a.com b.com 

Cependant, lorsque je tente de faire engine.insert("B", "c.com"), ce que je veux est qu'un nouveau nœud de texte doit être LIÉ (car il n'y a qu'un seul nœud de mot (ce qui est d'A)) au lien liste des noeuds de mot (s) et maintenant ce « milieu » du nœud de mot est attaché à la variable de référence de noeud url local (unode) et la sortie doit être:

A: a.com b.com 

B: c.com 

Mais quand je lance ceci, cela est la sortie :

A: a.com b.com 

B: a.com b.com c.com 

Qu'est-ce que je fais mal ici? Je pense que ma logique est bonne. Est-ce dû à la méthode toString()? J'ai besoin d'aide sérieuse. Toute aide est la bienvenue. Merci!

Répondre

2

Votre logique de mise en œuvre est bien, sauf pour la méthode toString(). Lorsque vous avez terminé avec un WNode, vous devez vider la chaîne qui contient le contenu du UNode correspondant.

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

Jetez un oeil à la deuxième dernière ligne, où j'ai commenté. C'est ce que vous devez insérer pour le faire fonctionner correctement. Sinon, vous ajouterez simplement le contenu de tous les champs UNode au fil du temps.

+0

Merci de m'avoir aidé. –

3

Vous ne réinitialisez pas str dans votre boucle while externe, ce qui entraîne le report des URL à l'itération suivante. Voir fixe toString() ci-dessous:

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

Merci beaucoup. Maintenant ça marche enfin! :) –