2014-01-11 74 views
0

我已經爲學校定製的鏈表節點類和我已經決定要練習如何通過生成類似遊戲自定義鏈接有列表

文本扭在我的鏈表類使用它不需要的元素,我有一個遍歷方法,可以將單詞打印出來,並將單詞輸入控制檯多長時間。

我到目前爲止的代碼是這樣的:

MyLinkedList.java

package game; 

public class MyLinkedList { 
    public int counter; 
    public MyNode head; 
    public MyNode tail; 

    public MyLinkedList() { 
     counter = 0; 
    } 

    public void InsertToHead(MyNode m) { 
     if (counter == 0) { 
      head = tail = m; 
     } else { 
      m.setNext(head); 
      head.setPrev(m); 
      head = m; 
     } 
     counter++; 
    } 

    public int size() { 
     return counter; 
    } 

    public boolean isEmpty() { 
     if (counter == 0) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public MyNode retrieveWord(String s) { 
     MyNode n = head; 
     while (n.next != null) { 
      if (s.equals(n.getWord())) { 
       return n; 
      } else { 
       n = n.next; 
      } 
     } 
     if (s.equals(tail.getWord())) { 
      return tail; 
     } 
     return null; 
    } 

    public MyNode retrieveLength(int l) { 
     MyNode n = head; 
     while (n.next != null) { 
      if (l == n.getLength()) { 
       return n; 
      } else { 
       n = n.next; 
      } 
     } 
     if (l == tail.getLength()) { 
      return tail; 
     } 
     return null; 
    } 

    public void traverse() { 
     MyNode n = head; 
     if (head != null) { 
      while (n.next != null) { 
       System.out.println(n.getWord() + "\t" + n.getLength()); 
       n = n.next; 
      } 
      System.out.println(tail.getWord() + "\t" + n.getLength()); 
     } 
    } 
} 

MyNode.java

package game; 

public class MyNode { 

    public String word; 
    public int length; 
    public MyNode next, previous; 

    public MyNode() { 
     word = null; 
     length = 0; 
     next = null; 
     previous = null; 
    } 

    public MyNode(String w, int l) { 
     word = w; 
     length = l; 
     next = null; 
     previous = null; 
    } 

    public void setNext(MyNode n) { 
     next = n; 
    } 

    public void setPrev(MyNode n) { 
     previous = n; 
    } 

    public void toHead(MyNode n){ 
     while(n.previous != null){ 
      n.setPrev(n); 
     } 
    } 
    public void setWord(String w){ 
     word = w; 
    } 
    public String getWord(){ 
     return word;  
    } 
    public void setLength(int l){ 
     length = l; 
    } 
    public int getLength(){ 
     return length; 
    } 
    public boolean hasNext(){ 
     return next != null; 
    } 
} 

WordSort.java

package game; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class WordSort { 
Scanner wordScan; 

public WordSort() { 
    MyLinkedList sixLetters = new MyLinkedList(); 
    MyLinkedList fiveLetters = new MyLinkedList(); 
    MyLinkedList fourLetters = new MyLinkedList(); 
    MyLinkedList threeLetters = new MyLinkedList(); 
    MyLinkedList rejects = new MyLinkedList(); 
    try { 
     wordScan = new Scanner(new File("corncob_lowercase.txt")); 
     wordScan.useDelimiter("\r\n"); 
     MyLinkedList ll = new MyLinkedList(); 
     while (wordScan.hasNext()) { 
      String temp = wordScan.next(); 
      MyNode node = new MyNode(); 
      node.setWord(temp); 
      node.setLength(temp.length()); 
      ll.InsertToHead(node); 
      if (temp.length() == 6) { 
       sixLetters.InsertToHead(node); 
      } else if (temp.length() == 5) { 
       fiveLetters.InsertToHead(node); 
      } else if (temp.length() == 4) { 
       fourLetters.InsertToHead(node); 
      } else if (temp.length() == 3) { 
       threeLetters.InsertToHead(node); 
      } else { 
       rejects.InsertToHead(node); 
      } 
     } 
     wordScan.close(); 
     threeLetters.traverse(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     System.out.println("Missing File: corncob_lowercase.txt"); 
    } 
} 
} 

最後, Driver.java

package game; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Driver extends JPanel { 
private static final long serialVersionUID = 1L; 

public Driver() { 
    new WordSort(); 
} 

public static void main(String[] args) { 
    JFrame frame = new JFrame("Hidden Word"); 
    frame.setSize(500, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(new Driver()); 
    frame.setVisible(true); 
} 
} 

每當我運行此代碼,所有的鏈表(threeLettersfourLettersfiveLetterssixLetters)是完全正常,直到最後一刻,當threeLetters.traverse()被調用時,我得到這個輸出(僅端部)

act 3 
ace 3 
aby 3 
abe 3 
abducts 7 
abductors 9 
abductor 8 
abductions 10 
abduction 9 
abducting 9 
abducted 8 
abdominal 9 
abdomens 8 
abdomen 7 
abdication 10 
abdicating 10 
abdicates 9 
abdicated 9 
abdicate 8 
abbreviations 13 
abbreviation 12 
abbreviating 12 
abbreviates 11 
abbreviated 11 
abbreviate 10 
abattoirs 9 
abattoir 8 
abatement 9 
abashed 7 
abasement 9 
abandons 8 
abandonment 11 
abandoned 9 
abandon 7 
abalone 7 
aardwolf 8 
abe 8 

我似乎無法找出爲什麼它的發生,但它看起來像它的abe後打印出一切,這與它註冊爲3個字母,一次是8個字母打印abe兩次,一次!

我是從這個網站的文本文件:

http://www.mieliestronk.com/corncob_lowercase.txt

回答

1

你這裏的問題主要是設計之一。主要缺陷:嘗試在多個鏈接列表中使用一個實例MyNode

當你InsertToHead(node)你正在修改node本身的內容,特別是頭部和下一個引用。

修復: 簡單地聲明一個new MyNode爲您要使用它的每個LinkedList。在您的項目中,特別是您使用任何給定節點兩個。 ll<inset_number>Letters列表之一。所以,聲明一個新的MyNode每個列表:

... 
while (wordScan.hasNext()) { 
    String temp = wordScan.next(); 
    MyNode node = new MyNode(); 
    MyNode node2 = new MyNode(); 
    node.setWord(temp); 
    node2.setWord(temp); 
    node.setLength(temp.length()); 
    node2.setLength(temp.length()); 
    ll.InsertToHead(node2); 
... 

這應該解決您的問題。

如果你想知道它爲什麼發生。跟蹤代碼。它與嘗試添加已經有更多節點附加到列表中的節點有關。

其他注意事項:

  • 請儘量避免public領域,除非你確定你想要他們。 I.E.在MyLinkedList有人使用你的課堂應該無法訪問(甚至看不到!)counter,headtail,所以那些應該是private。如果你真的想訪問他們,創造getset方法

  • 你嵌套如果WordSort塊是一個switch這樣一個完美的地方:

    switch(temp.length()) { 
        case 6: 
         sixLetters.InsertToHead(node); 
         break; 
        case 5: 
         fiveLetters.InsertToHead(node); 
         break; 
        case 4: 
         fourLetters.InsertToHead(node); 
         break; 
        case 3: 
         threeLetters.InsertToHead(node); 
         break; 
        default: 
         rejects.InsertToHead(node); 
         break;    
        } 
    
  • MYNODE正常工作作爲一個單獨的類。不過,我會多次選擇像節點一樣實現一個簡單的類作爲nested class。它可以使一些非常乾淨的代碼。試試看!

  • 設計你的課堂時要小心。你的設計中有很多額外的方法。可以很容易地提前創建您可能會或可能不會使用的方法。我喜歡只在創建方法時才能看到我在需要使用相關類的類中使用它們。

快樂編碼!

+0

謝謝!這幫了很大的忙! – bucksnort2

+1

我還添加了拒絕列表以查看它是否有幫助,這對我的代碼沒有必要 – bucksnort2