مخصص القائمة المرتبطة وجود العناصر غير المرغوب فيها
-
22-12-2019 - |
سؤال
لقد جعلت مخصص قائمة مرتبطة و عقدة فصول المدرسة قررت التدرب على كيفية استخدامها من خلال جعل النص-تطور مثل لعبة
في قائمة مرتبطة فئة لدي اجتياز الأسلوب الذي يطبع كلمة و كم كلمة في وحدة التحكم.
رمز لدي حتى الآن هو:
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);
}
}
كلما قمت بتشغيل هذه التعليمة البرمجية جميع القوائم المرتبطة (threeLetters
, fourLetters
, fiveLetters
, ، sixLetters
) هي تماما ما يرام حتى النهاية ، عندما 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
وأنه يطبع abe
مرتين, مرة مع تسجيل 3 حروف و مرة واحدة 8 رسائل طويلة!
لدي ملف نصي من هذا الموقع:
المحلول
المشكلة هنا هو أساسا من تصميم.العيب الرئيسي:محاولة استخدام مثيل واحد MyNode
في العديد من القوائم المرتبطة.
عند InsertToHead(node)
أنت تعديل محتويات node
نفسها ، وتحديدا رئيس التالي المراجع.
Fix:بسيطة تعلن 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
,head
أوtail
, لذا ينبغيprivate
.إذا كنت حقا ترغب في الوصول إليها, إنشاءget
وset
طرقالمتداخلة إذا كتلة في
WordSort
هو المكان المثالي التبديل مثل هذا: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 يعمل بشكل جيد فئة منفصلة.ومع ذلك أنا سوف مرات عديدة اختيار لتنفيذ فئة بسيطة مثل عقدة كما متداخلة الدرجة.يمكن أن تجعل بعض رمز نظيفة جدا.في محاولة منه!
كن حذرا عند تصميم الفصول الدراسية.هناك الكثير من أساليب إضافية في التصميم الخاص بك.يمكن أن يكون من السهل أن تشرب قبل خلق أساليب كنت قد أو قد لا تستخدم أي وقت مضى.أحب فقط إنشاء الطرق عندما أرى أنني بحاجة لهم في فئة يستخدم فئة في السؤال.
سعيد الترميز!