مخصص القائمة المرتبطة وجود العناصر غير المرغوب فيها

StackOverflow https://stackoverflow.com//questions/21058081

  •  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 رسائل طويلة!

لدي ملف نصي من هذا الموقع:

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

هل كانت مفيدة؟

المحلول

المشكلة هنا هو أساسا من تصميم.العيب الرئيسي:محاولة استخدام مثيل واحد 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 يعمل بشكل جيد فئة منفصلة.ومع ذلك أنا سوف مرات عديدة اختيار لتنفيذ فئة بسيطة مثل عقدة كما متداخلة الدرجة.يمكن أن تجعل بعض رمز نظيفة جدا.في محاولة منه!

  • كن حذرا عند تصميم الفصول الدراسية.هناك الكثير من أساليب إضافية في التصميم الخاص بك.يمكن أن يكون من السهل أن تشرب قبل خلق أساليب كنت قد أو قد لا تستخدم أي وقت مضى.أحب فقط إنشاء الطرق عندما أرى أنني بحاجة لهم في فئة يستخدم فئة في السؤال.

سعيد الترميز!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top