java программа печатает объекты в неправильном порядке - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь написать класс под названием RailwayStation, который будет печатать массив поездов (используя два разных класса, которые я написал, под названием TIME1 и Train. Моя проблема в том, что я не могу понять, почему вывод расположен в неправильном порядке.

Я предполагаю, что проблема в методе внутри класса под названием addTrain, который должен был добавить поездку на поезде, если в массиве есть пустая ячейка, и если поездка который хочет быть добавлен, уже не существует в массиве. Другой метод, который я использовал (и, возможно, проблема), называется removeTrain, который получает параметр поездки на поезде и удаляет его из массива. Мои методы addTrain , removerTrain и toString выглядит следующим образом:

    public class RailwayStation {

        // declrations of final variables
        private final int MAX_TRAINS = 100;
        private final int MIN_VAL = 0;

        // declrations of instant variables

        private Train[] _station;
        private int _noOfTrs;

        /**
         * Empty construter which initialize the instant variables of the class such that the trips array will be in a maximal size
         */
        public RailwayStation() {
            _station = new Train[MAX_TRAINS];
            _noOfTrs = MIN_VAL;
        }

        /**
         * adds a train trip to the trips array
         *
         * @param f the train trip
         * @Returns true if a train trip has been added to the trips array
         */
        public boolean addTrain(Train f) {
            int i, j;
    //        boolean found = false;
            if (isTrainOnSomeStation(f)) {
                return false;
            }
            else {
                for (j = MIN_VAL; j < _station.length; j++) {
                    if (_station[j] == null) {
                        _station[j] = f;
                        _noOfTrs++;
                        return true;
                    }
                }
                return false;
            }
        }

        // a private method that checks if @param f is null
        private boolean isTrainOnSomeStation(Train f) {
            if (f == null) {
                return false;
            }
            for (int i = MIN_VAL; i < _station.length; i++) {
                if (_station[i] != null && _station[i].equals(f)) {
                    return true;
                }
            }
            return false;
        }
 /**
     * removes a trip from the trips array
     * @param f the train trip
     * @returns true if the train trip has been removed
     */
    public boolean removeTrain(Train f) {
        int i, j;
        boolean found = false;
        for (j = MIN_VAL; j < _station.length && !found; j++) {
            if (_station[j] != null) {
                for (i = MIN_VAL; i < _noOfTrs && !found; i++)
                    if (_station[i].equals(f)) {
                        _station[i] = _station[_noOfTrs];
                        _station[_noOfTrs] = null;
                        found = true;
                        _noOfTrs--;
                    }
            }
        }
        return found;
    }
        /** Returns a string which describes all train in the array as apperas in the arrray
         * @Returns a string of trains as appears in the arrat
         */
        public String toString(){
            String str = "The trains today are:" +"\n";
            if(_noOfTrs == MIN_VAL){
                return "There are no trains today.";
            }
            else {
                String capacity = "";
                for (int i = 0; i < _station.length; i++) {
                    if (_station[i] != null) {
                        if (_station[i].isFull() == true) {
                            capacity = "Train is full";
                        }
                        else {
                            capacity = "Train is not full";
                        }
                        str += _station[i].toString() + "\n";
                    }
                }
            }
            return str;
        }
    }

Для вызова метода addTrain я напишу:

//Check constructor
        RailwayStation rs = new RailwayStation();

        //AddTrain
        Train f1 = new Train("Haifa",12,0,210,250,250,55);
        Train f2 = new Train("Jerusalem",10,50,210,250,250,40);
        rs.addTrain(f1);
        rs.addTrain(f2);
        System.out.println(rs);

        //RemoveTrain
        rs.removeTrain(f1);
        System.out.println(rs);

        //First Train to Destination
        Train f3 = new Train("Tel-Aviv",11,35,180,100,200,35);
        rs.addTrain(f3);
        Train f3a = new Train("Tel-Aviv",7,15,180,200,200,35);
        rs.addTrain(f3a);

Я ожидаю получить результат:

The trains today are:
Train to Jerusalem departs at 10:50. Train is full.
Train to Tel-Aviv departs at 11:35. Train is not full.
Train to Tel-Aviv departs at 07:15. Train is full.

, но я получаю:

The trains today are:
Train to Tel-Aviv departs at 11:35. Train is not full.
Train to Jerusalem departs at 10:50. Train is full.
Train to Tel-Aviv departs at 07:15. Train is full.

Я попытался использовать отладчик, чтобы понять, в какой части неправильный порядок, но я не могу найти проблему Эм.

1 Ответ

2 голосов
/ 07 мая 2020

Когда вы добавляете первые поезда, ваш массив выглядит так:

Train[0] = Haifa...
Train[1] = Jerusalem..
Train[2] = null
Train[3] = null
...

Затем вы удаляете Haifa:

Train[0] = null
Train[1] = Jerusalem..
Train[2] = null
Train[3] = null
...

Затем вы добавляете другие поезда:

Train[0] = Tel Aviv..
Train[1] = Jerusalem..
Train[2] = Tel Aviv..
Train[3] = null
...

Это объясняет?


Структура данных, которую вы пытаетесь создать здесь, - Stack, но хорошая новость в том, что java уже имеет один , поэтому не нужно делать то, что вы пытаетесь сделать:

        Stack<Train> trains = new Stack<>();
        Train f1 = new Train("Haifa",12,0,210,250,250,55);
        Train f2 = new Train("Jerusalem",10,50,210,250,250,40);
        trains.push(f1);
        trains.push(f2);

        //RemoveTrain
        trains.remove(f1);


        //First Train to Destination
        Train f3 = new Train("Tel-Aviv",11,35,180,100,200,35);
        trains.push(f3);
        Train f3a = new Train("Tel-Aviv",7,15,180,200,200,35);
        trains.push(f3a);

        String str = "The trains today are:" +"\n";
        for(Train train: trains) {
            str = str + train + "\n";
        }
        System.out.println(str);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...