1

基本的に、このプログラムは、変更できない議長を含む幹部の「円卓会議」を作成することになっています。自分が何をしているのかはほぼわかっていて、エグゼクティブの挿入と削除の方法はほぼ半分ですが、コードをテストして、コードがどのように機能しているかを確認しようとしました。議長を入力するとすぐにエラーが発生します。情報。また、ExecutiveListのremoveByCorporationメソッドをどのように実行するのかまったくわかりません。私は、この方法がほぼすべて正しくないことをほぼ確信しており、このような循環二重リンクリスト内のノードを削除する方法ではありません。

*印刷方法については、私を助ける必要はありません。私はまだそれらに到達していません。

tl; dr:1)なぜすぐにクラッシュするのですか?2)removeByCorporationメソッドが完全に間違っていると確信しています。もしそうなら、それを修正する方法について何か提案や助けはありますか?

これが私が問題を抱えている2つのクラスです。他のクラスが私に知らせてくれるのを見たい場合は、それらを投稿しますが、それらは99%のゲッターとセッターです。

ファーストクラス

public class ExecutiveList {

private ExecutiveNode chair;
ExecutiveNode cursor;

public ExecutiveList() {

}

public ExecutiveList (Executive chairperson) {

    chair.setExecutive(chairperson);
    chair.left = chair;
    chair.right = chair;
}

public void insertLeftOfChair(Executive exec) {

    ExecutiveNode newExec = new ExecutiveNode();
    newExec.setExecutive(exec);
    chair.setLeft(newExec);

}

public boolean insertRightOfExec (Executive exec, String target) {
    cursor = chair;
    ExecutiveNode newExec = new ExecutiveNode();

    do { cursor = cursor.getLeft();
    if (cursor.getExecutive().equals(exec)) {
        newExec.setExecutive(exec);
        cursor.getRight().setLeft(newExec);
        newExec.setLeft(cursor);
        newExec.setRight(cursor.getRight());
        cursor.setRight(newExec);
        return true;
    }
    else {
        return false;
    }
    }       while (cursor.getExecutive().getExecutiveName() != target);


}

public boolean insertLeftOfExec (Executive exec, String target) {
    cursor = chair;
    ExecutiveNode newExec = new ExecutiveNode();
    do { cursor = cursor.getLeft();
        if (cursor.getExecutive().equals(exec)) {
            newExec.setExecutive(exec);
            cursor.getLeft().setRight(newExec);
            newExec.setRight(cursor);
            newExec.setLeft(cursor.getRight());
            cursor.setLeft(newExec);

            return true;
        }
        else {
            return false;
        }
    }       while (cursor.getExecutive().getExecutiveName() != target);
}

public boolean removeTargetExec(String name) {
    if (chair.equals(name)) {
        return false;
    }
    else {
        return false;
    }
}

public int removeByCorporation(String corporation) {
    int removed = 0;
    cursor = chair;
    do {
        if (cursor.getExecutive().getCompanyName().equals(corporation)) {
            cursor.setExecutive(null);
            cursor.getLeft();
            removed = removed + 1;
        }
    } while (removed > 0);

    return removed;
}

public void printByCorporation(String corporation) {

}

public void printAllClockwise() {

}

public void printAllCounterClockwise() {

}
    }

セカンドクラス

import java.util.Scanner;

    public class MeetingManager {
public static void main(String[] args) {

    // scanner to read the users input
    Scanner input = new Scanner(System.in);

    // strings to pass information about the chairperson
    String chairpersonName;
    String chairpersonCompany;

    // strings to pass information about executives other
    // than the chairperson
    String execName;
    String execCompany;
    String target;

    // holds information on whether on not an operation
    // was successful and how many executives were removed
    // for the remove by corporation command.
    boolean success;
    int numRemoved = 0;

    // prompts the user for information about the chairperson
    // and sets it to an executive object name chairperson
    System.out.println("Enter the name of the chairperson: ");
    chairpersonName = input.next();
    if (chairpersonName.length() < 1) {
        System.out.println("Please enter a full name");
    }
    System.out.println("Enter the company of the chairperson: ");
    chairpersonCompany = input.next();
    if (chairpersonCompany.length() < 1) {
        System.out.println("Please enter a full name");
    }
    Executive chairperson = new Executive(chairpersonName, chairpersonCompany);

    // creates a new ExecutiveList object and passes information
    // about the chairperson
    ExecutiveList list = new ExecutiveList(chairperson);

    // for loop to repeatedly print the menu and take instructions
    // from the user until they choose to exit.
    for (int i = 1; i > 0; i++) {
        ShowMenu();
        String option = input.next();

        // error message for improper input
        if (option.length() > 3) {
            System.out.println("You can only enter one option");
        }

        // insert left of chairperson
        else if (option.toUpperCase().equals("ILC")) {
            System.out.println("Enter the executives name: ");
            execName = input.next();
            System.out.println("Enter the executives company: ");
            execCompany = input.next();
            Executive newGuy = new Executive(execName, execCompany);
            list.insertLeftOfChair(newGuy);
            System.out.println("Insertion successful.");
        }

        // insert left of executive
        else if (option.toUpperCase().equals("ILE")) {
            System.out.println("Enter the executives name: ");
            execName = input.next();
            System.out.println("Enter the executives company: ");
            execCompany = input.next();
            Executive newGuy = new Executive(execName, execCompany);
            System.out.println("Enter the name of the target executive: ");
            target = input.next();

            success = list.insertLeftOfExec(newGuy, target);
            if (success == true) {
                System.out.println("Insertion successful.");
            }
            else {
                System.out.println("The executive could not be inserted.");
            }
        }


        // insert right of executive
        else if (option.toUpperCase().equals("IRE")) {
            System.out.println("Enter the executives name: ");
            execName = input.next();
            System.out.println("Enter the executives company: ");
            execCompany = input.next();
            Executive newGuy = new Executive(execName, execCompany);
            System.out.println("Enter the name of the target executive: ");
            target = input.next();

            success = list.insertRightOfExec(newGuy, target);
            if (success) {
                System.out.println("Insertion successful.");
            }
            else {
                System.out.println("The executive could not be inserted.");
            }
        }

        // remove target executive
        else if (option.toUpperCase().equals("RTE")) {
            System.out.println("Enter the name of the executive to remove: ");
            execName = input.next();
            success = list.removeTargetExec(execName);

            if (execName.equals(chairpersonCompany))
                list.removeTargetExec(execName);
            if (success) {
                System.out.println(execName + " has been removed from the meeting.");
            }
            else {
                System.out.println(execName + " could not be found.");
            }
        }

        // remove by corporation
        else if (option.toUpperCase().equals("RBC")) {
            System.out.println("Enter the name of the corporation to remove: ");
            execCompany = input.next();
            numRemoved = list.removeByCorporation(execCompany);
            if (execCompany.equals(chairperson.getCompanyName())) {
                System.out.println("Invalid command: cannot remove all employees from the chairperson's corporation");
            }
            else if (numRemoved < 1) {
                System.out.println("That corporation could not be found and no executives were removed.");
            }
            else {
                System.out.println(numRemoved + " executive(s) from " + execCompany + " have been removed from the meeting.");
            }
        }

        // prints by corporation
        else if (option.toUpperCase().equals("PBC")) {
            System.out.println("Enter the name of a corporation to display: ");
            execCompany = input.next();
            list.printByCorporation(execCompany);
        }

        // prints all counter-clockwise
        else if (option.toUpperCase().equals("PCC")) {

            list.printAllCounterClockwise();
        }

        // prints all clockwise
        else if (option.toUpperCase().equals("PCL")) {

            list.printAllClockwise();
        }

        else if (option.toUpperCase().equals("EXT")) {
            System.out.println("Terminating program...");
            break;
        }

        // Error message
        else {
            System.out.println("Please select a valid option.");
        }

    }

}



// displays menu and prompts user for input
public static void ShowMenu() {
    System.out.println("\nILC) Insert an executive to the left of the chairperson\nILE) Insert an executive to the left of a given executive\nIRE) Insert an executive to the right of a given executive\nRTE) Remove Target Executive");
    System.out.println("RBC) Remove By Corporation\nPBC) Print By Corporation\nPCC) Print all in counter-clockwise order\nPCL) Print all in clockwise order\nEXT) Exit the program\n\nSelect a menu option: ");
}

}

最後に、何らかの形や形で、あらゆる種類の提案やアドバイス、または実際の支援を提供してくれた人に感謝します。学生が「宿題をしてくれ」と言っているので、どういうわけか宿題の質問を見ると腹が立つのは知っていますが、それは私がやっていることではありません。アドバイスやヒントが欲しいのですが、私のために空欄に記入してすべてを修正するように求めているのではありません(私がそれに反対するわけではありません:P)。ありがとう。

4

2 に答える 2

1

removeByCorporationメソッドでは、エグゼクティブをnullに設定しているだけですが、これを二重リンクリストと見なすと、二重リンクリストが壊れないように、前と次のエグゼクティブの参照を設定する必要があるとは思わないでください。

于 2012-02-17T04:33:26.437 に答える
0

秘訣は、すべての操作で、変更されるアイテムとそれを参照する他の2つのアイテムを更新することを確認することです(二重にリンクされたリストで非常に便利で、それを参照する2つはそれが参照する2つでもあります)。

それぞれの方法をチェックし、それぞれの方法で、変更ごとに4つのフィールドを更新していることを確認します。件名に2つ、件名からリンクされている2つにそれぞれ1つです。

于 2012-02-17T04:40:43.097 に答える