2014-03-29 58 views
0

顯示我有以下文字:每個字打印多少次排序的字符串單鏈表

"better better yes yes yes better finally the rock rock the". 

我寫這需要每一個字,並將其添加到鏈接列表的方法。 然後我寫了另一種使用合併排序的方法。

鏈表我拿到後歸併排序如下:

"better better better finally rock rock the the yes yes yes". 

所以以上兩種方法很好地工作。 :-)

我想剛剛打印的清單時計數器值,顯示它是多少次在列表中顯示爲沿着顯示只有一次的每個節點。 不應從鏈接列表中刪除重複的節點。

所以結果我應該得到的是:

better 3 
finally 1 
rock 2 
the 2 
yes 3 

代碼:

public class WordNode 
{ 

private String _word; 
private WordNode _next; 

/** 
* Constructor for objects of class WordNode 
*/ 

public WordNode(String wrd, WordNode node) 
{ 
    this._word = wrd; 
    this._next = node; 

} 


public class TextList 
{ 

    private WordNode _head; 


    public TextList() 
    { 
    _head = null; 
    } 

所以我寫了下面的toString()方法:

public String toString() 
{ 
    String result = ""; 

    int count = 1; 

    WordNode currentNode = _head; 
    WordNode tmp = currentNode.getNext(); 

    if (currentNode == null) 
     return null;  


    while(currentNode != null) 
    { 
     tmp = currentNode.getNext(); 

     while (tmp != null && currentNode.getWord().equals(tmp.getWord())) 
     { 
      count++; 
      tmp = tmp.getNext(); 
     } 

     result += currentNode.getWord() + "\t" + count + "\n"; 
     count = 1; 
     currentNode.setNext (tmp); 
     currentNode = currentNode.getNext();    
    } 


    return ("The List is: " + result); 

} 

但印刷後,我得到:

The List is: better 3 
finally 1 
rock 2 
the 1 
the 1 
yes 3 

調試過程中,我發現了toString()方法將不能正確計算它被添加到鏈表中的最後一個字(「的」 ...)。

「所述」 是(a)中示出而不是兩次只有一次(b)該計數器是1而不是2

請協助。

#####################################

我增加了更多的信息:

我還有一個測試類,基本上只是調用構造函數。

String text1 ="better better yes yes yes better finally the rock rock the"; 
TextList list1 = new TextList(text1); 
System.out.println("\nResult: "); 
System.out.println(list1); 

的文本清單構造基本分析的全文,將它正確,然後調用它增加了每個文本的鏈接列表的另一種方法。

public TextList (String text) 
    { 
     String textToAdd; 

     int i = 0, j = 0; 



     while (i < text.length()-1) 
     { 
      System.out.print("\n"); 
      System.out.println("I = " + i); 


      while ((text.charAt(j) != ' ') && (j < text.length()-1)) 
       { 
        char c = text.charAt(j);  
        if (j != text.length()) 
        j++; 
       } 
      //J Pointer points to the "backspace".  

      textToAdd = text.substring(i,j+1); //Puts the word in textToAdd. 

      System.out.print("textToAdd -> " + textToAdd); 
      System.out.print("\n"); 

      addToData(textToAdd); // adding the word to the linked list. 

      j++; // Taking the pointer one step futher again so it will be pointing to the first charcater of the next word 

      i = j; 
     } 

     _head = _head.mergeSort(_head); 

    } 





public void addToData (String word) 
{ 

if (_head == null) 
    _head = new WordNode (word, null); 
else 
    { 
    WordNode currentNode = _head; 
    while (currentNode.getNext() != null) 
     currentNode = currentNode.getNext(); 

    currentNode.setNext (new WordNode (word, null)); 

    } 

在添加所有單詞後,構造函數通過調用合併排序完成。

不需要在這裏複製合併排序。

有什麼建議嗎?

在此先感謝。

+0

你如何閱讀列表?看起來你讀的最後一個單詞末尾有一個額外的字符,看起來是不可見的,或者''''''的最後一個字符是不同的。這就是爲什麼它排序正確,但它不會從列表中算作'equal()'到'other'。 – dasblinkenlight

+0

嗨,感謝您的回覆,我在原始帖子中添加了更多信息。我期待在這裏獲得一些幫助。謝謝。 – qwerty

+0

我在我的代碼中發現了這個錯誤。由於我是新成員,因此直到從原來的發佈時間過去8小時後,我才能回答自己的帖子。一旦間隔過期,我會發布修復。 – qwerty

回答

1

你的解決方案過於簡單,請使其更加複雜:P

您可以使用地圖來計數的String對象。

public class Program { 
    public static void main(String[] args) { 
     String inputString = "better better yes yes yes better finally the rock rock the"; 
     String[] words = inputString.split("\\s"); 

     Map<String, Integer> map = new TreeMap<String, Integer>(); 
     for (String word : words) { 
      Integer numberOfWords = map.get(word); 

      if (numberOfWords == null) { 
       numberOfWords = 0; 
      } 

      map.put(word, ++numberOfWords); 
     } 

     for (String word : map.keySet()) { 
      System.out.println(word + " " + map.get(word)); 
     } 
    } 
} 

輸出:

better 3 
finally 1 
rock 2 
the 2 
yes 3 
+0

哈哈!謝謝Gaskoin。但是,由於上述練習是功課的一部分,我非常有限,我可以使用(我甚至不能使用String split()方法)。無論如何,如前所述,我發現了這個錯誤。該錯誤是我用substring()方法。由於我是新成員,因此直到從原來的發佈時間過去8小時後,我才能回答自己的帖子。一旦間隔過期,我會發布修復。 – qwerty