0

我已经在这个程序上工作了几个星期,这是我们在 Java 编程课上的最后一个项目,它让我(和许多其他学生)非常头疼。我们需要创建一个程序,允许用户输入、显示和删除新飞机以及飞机的速度、高度和飞机类型。在让主类与其他类进行交流方面,我遇到了最多的问题。因此,我不知道我的 LinkedList 是否会正常工作,或者根本不知道。我担心列表不会正确地将所有字段存储在一起,并且节点没有正确编码。我真的可以使用您可以提供的任何帮助或建议。代码如下。我愿意接受任何和所有建议。

主班。这是用户将与程序交互的地方。我一直很难让其他类的方法在这个类中工作。我敢肯定,我缺少一些简单的东西。

package airTraffic;

import java.util.*;

public class Main {

static Scanner in = new Scanner(System.in);

public static void main(String[] args) {

    do {
        try {
            System.out.println("Please enter command to proceed: ");
            System.out.println("Enter new aircraft = e");
            System.out.println("Display all aircraft = d");
            System.out.println("Show specific flight = s");
            System.out.println("Remove specific flight = r");
            String command = in.next();
            in.next(command);

            if ( (in.next(command)).equals("e") ) {
                ATControl.addToList();  // need to somehow "start" this class 

            } else if ( (in.next(command)).equals("d") ) {
                ATControl.displayAll();

            } else if ( (in.next(command)).equals("s") ){
                ATControl.showFlight();

            } else if ( (in.next(command)).equals("r") ) {
                ATControl.removeFlight();

            } else if ( (in.next(command)).equals(null) ) {
            }
        } catch (InputMismatchException exc) {
            System.out.println("Wrong entry, please try again:");
        }
    } while (true);
}
}

链表和节点——我称之为飞机。我认为这是存储和创建列表的地方。对列表的操作发生在下一个类(ATControl)中,或者至少我认为会发生。

package airTraffic;

import java.util.LinkedList;

public class Aircraft  {

// stores data
private static final int INITIAL_ALLOCATION = 20;
private int size = INITIAL_ALLOCATION; 

//declare LinkedList and node names
static LinkedList <String> list = new LinkedList <String> ();
private Aircraft head = new Aircraft ();
private Aircraft tail = new Aircraft ();

// tells list to add nodes
public  void addNodes (int n, LinkedList<String> s) {
    s = list;
    head.next = tail;
    tail.next = tail;
    size = n;
    Aircraft temp = head;
    for (int i= 0; i < size; ++i) {
        temp.next = new Aircraft ();
        temp = temp.next;
    }
    temp.next = tail;
}

private String value;
Aircraft craft;

public Aircraft (String v) {
    value = v;
}

public Aircraft () {

}

public String get () {
    return value;
}

public void set (String v) {
    value = v;
}

public Aircraft next = null;

//auto generated method from ATControl 
public static void add(String flight) {
    // a for or while loop might be needed here. Seems to easy to just have an empty add class

}
//auto generated method from ATControl
public static void remove() {

}
 }

ATControl 类。这是(我认为)列表被操纵的地方,允许用户添加、删除和显示航班。

package airTraffic;

import java.util.*;

public class ATControl{

// implement Aircraft class (node) - empty argument list?? 
Aircraft aircraft = new Aircraft ();

static Scanner in = new Scanner (System.in);

// list of planes 
static String [] planeList = {"Wide-body Airliner = w", "Regional Airliner = r", "Private Plane = p", 
        "Military = m", "Cargo only: c", "Unknown = u"};

//add plane and details
public static void addToList () {
    System.out.printf("Enter flight number: ");
    String flight = in.nextLine();
    Aircraft.add(flight);

    //type of plane
    System.out.printf("Enter type of plane, ", "Choose from: " + planeList);
    String type = in.nextLine();
    try {
    if (type == "w") {
         System.out.println("Wide-body Airliner");
    }else if (type == "r") {
             System.out.println("Regional Airliner");
    }else if (type == "p") {
         System.out.println("Private Plane");
    }else if (type == "m") {
         System.out.println("Military");
    }else if (type == "c") {
         System.out.println("Cargo only");
    }else if (type == "u") {
         System.out.println("Unknown");
    } else type = null;
        }
    catch (InputMismatchException i) {
        System.out.println("You must enter valid command: " + planeList);
    }
    Aircraft.add(type);

    //plane speed
    System.out.printf("Enter current speed: ");
    String speed = in.nextLine();
    Aircraft.add(speed);

    //add Altitude 
    System.out.printf("Enter current altitude: ");
    String alt = in.nextLine();
    Aircraft.add(alt);
}

//show flight
public static void showFlight () {
    System.out.printf("Enter flight number for details: ");
    in.nextLine();
    Aircraft.get(Aircraft, index);
}

// display all flights
public static void displayAll () {
    System.out.printf("All flights: " );

}

//remove flight
public static void removeFlight () {
    System.out.printf("Enter flight number to be removed: ");
    in.nextLine();
    Aircraft.remove();
}   
}

有任何想法吗?谢谢!

4

3 回答 3

2

要“启动”ATControl,您需要创建它的一个新实例:

ATControl control = new ATControl();
control.addToList();

和你的一样Aircraft。您将希望使用 创建新实例new,然后Add()在它们上调用 等。

您可能还希望将您的Scannerfrom main 传递到新的 ATControl 并使用它来读取输入,而不是使用全新的Scanner

于 2012-07-30T17:07:37.250 回答
0
  • 您的一般设计似乎忽略了面向对象的原则。在我看来,飞机应该将其类型、速度和高度集中在一个对象中。

  • 为什么要重新发明轮子?JRE 中已经内置了大量预制的(并且经过良好测试的)集合类(例如 ArrayList、LinkedList)。利用它们来保存您的飞机实例。

这两项更改应该会大大减少您需要编写/维护的代码量,并且程序的整体复杂性应该会大大降低。

于 2012-07-30T17:31:56.380 回答
0

使用面向对象设计时,请将您的对象视为实际对象的表示。您的飞机类别应该代表一架实际的飞机。飞机应该跟踪与之相关的事物。因此,航班号、速度、高度等内容应该是该类的属性。

public class Aircraft{
    private int speed;
    private int altitude;
    private int flightNum;
    //
    //Regional Airliner, Military, Private Plane, etc.
    private String type;

    public void setSpeed(int speed){
        this.speed = speed;
    }
    public int getSpeed(){
        return speed;
    }
    //
    //TODO: Getters and Setters for the rest of the aircraft properties

}

现在几乎所有其他事情都应该由您的 ATControl 类处理。在这种情况下,使用 Aircraft 类型的数组列表似乎更合乎逻辑。

public class ATControl{
    private ArrayList<Aircraft> currentFlights;

    //
    //Constructor gets called on initialization
    public ATControl(){
        currentFlights = new ArrayList<Aircraft>();
    }

    //
    //User input should be handled in main class and passed into this
    public void addFlight(int flightNum, int speed, int altitude){
        Aircraft newCraft = new Aircraft();

        //
        //assign the properties we just got from the user to our new aircraft
        newCraft.setFlightNumber(flightNum);
        newCraft.setSpeed(speed);
        //
        //Now add our new flight to the list of current flights
        currentFlights.add(newCraft);

    }


}

您的主要课程几乎可以保持原样。不过,我会在那里处理所有用户输入。

public class Main {

    static Scanner in = new Scanner(System.in);


    public static void main(String[] args) {
       ATControl denverTrafficControl = new ATControl();
       //
       //Handle user input here: get the speed, altitude, flightNum, etc..

       denverTrafficControl.addFlight(flightNum, speed, altitude);

    }
}

这就是应该这样做的方式。希望这有助于您更好地掌握面向对象的设计。让主类处理 I/O,而您的其他实际“对象”类处理数据。祝你好运。

于 2012-07-31T17:59:26.913 回答