Программа не сохраняет до следующего доступного места

Проблема, с которой я столкнулся, заключается в следующем: я создал два массива, представляющих стыковочные места для кораблей. Первый массив объекта корабля (имя корабля и размер - обычно суперконтейнер) можно сохранить в массиве, и, если места нет, он будет добавлен в массив списка ожидания.

Я могу добавить только одно судно в список ожидания, и он говорит, что он заполнен. Вы можете помочь? Вот мой класс док-станции, проблема с waitList ():

import java.util.*;

public class Main {

static Scanner scan = new Scanner(System.in);
private static Ship[] dock1 = new Ship[10];
private static Ship[] waitingList = new Ship[10];

public static void main(String[] args) {
    menu();
}

public static void menu() {


    Scanner scan = new Scanner(System.in);


    while (true) {

        System.out.println("Choose an option: 1-3");
        System.out.println("1. Dock");
        System.out.println("2. Undock");
        System.out.println("3. Status");

        int menu = scan.nextInt();
        switch (menu) {
            case 1:
                System.out.println("1. Dock");
                dock();
                break;
            case 2:
                System.out.println("2. Undock");
                undock();
                break;
            case 3:
                System.out.println("3. Status");
                printDock();
                printWaitingList();
                break;
            case 4:
                System.out.println("4. Exit");
                System.exit(0);
            default:
                System.out.println("No such option");
                break;
        }
    }
}


public static void dock() {

    System.out.println("Enter ship's name: ");
    String name = scan.nextLine();

    System.out.println("Enter ship's size: ");
    String size = scan.nextLine();

    System.out.println("Enter the ships dock:");
    //Check if the dock number is valid
    int i = Integer.valueOf(scan.nextLine());
    if (i >= 0 && i < 10 && dock1[i] == null) {
        int c = 0;
        int co = 0;
        int sco = 0;
        for (int j = 0; j < dock1.length; j++) {
            if (dock1[j] != null &&         dock1[j].getShipSize().equals("Cargo")) {
                c++;
            }
            if (dock1[j] != null && dock1[j].getShipSize().equals("Container")) {
                co++;
            }
            if (dock1[j] != null && dock1[j].getShipSize().equals("Super-Container")) {
                sco++;
            }
        }

        if (c < 10 && co < 5 && sco < 2) {
            //Add ship to the dock
            dock1[i] = new Ship(name, size);
            System.out.println("Enough space you can dock");
            System.out.println("Ship has been docked");
        } else {
            System.out.println("You cannot dock");
            waitingList(name,size);
        }

    } else {
        System.out.println("Couldn't dock");
        waitingList(name, size);
    }

}


public static void undock() {
    System.out.println("Status of ships: ");
    printDock();
    System.out.println("Enter ship's name to undock: ");
    String name = scan.nextLine();
    //System.out.println("Enter ship's size to undock: ");
   // String size = scan.nextLine();

    for (int i = 0; i < dock1.length; i++) {
        if (dock1[i] != null && dock1[i].getShipName().equals(name)) {
            dock1[i] = null;
            System.out.println("Ship removed");
            /// HERE CHECK IF SHIP IN DOCK
            for (int j = 0; j < waitingList.length; j++) {
                if (dock1[i] == null) {
                    // Add ship to the dock
                    dock1[i] = new Ship(waitingList[j].getShipName(), waitingList[j].getShipSize());
                    System.out.println("Move ship from waiting list to dock 1");
                    waitingList[j] = null;
                   break;
                } else {
                    System.out.println("No space in dock1");
                    return;
                }
            }
        } else {
            System.out.println("Ship not docked here");
            break;
        }

    }

}

public static void waitingList(String name, String size){
    System.out.println("Dock 1 is full, ship will try to be added to Waiting List");
    for (int i = 0; i < waitingList.length; i++) {
        if (waitingList[i] == null) { //CHANGE TO ALLOW MORE THAN ONE SHIP
            //Add ship to the dock
            waitingList[i] = new Ship(name, size);
            System.out.println("Enough space added to waiting list");
            break;
        } else {
            System.out.println("No space on waiting list, ship turned away");
            return;
        }
    }

}


public static void printDock() {

    System.out.println("Docks:");

    for (int i = 0; i < dock1.length; i++) {
        if (dock1[i] == null) {
            System.out.println("Dock " + i + " is empty");
        } else {
            System.out.println("Dock " + i + ": " + dock1[i].getShipName() + " " + dock1[i].getShipSize());
        }
    }
}

private static void printWaitingList() {

    System.out.println("Waiting List:");

    for (int i = 0; i < waitingList.length; i++) {
        if (waitingList[i] == null) {
            System.out.println("Dock " + i + " is empty");
        } else {
            System.out.println("Dock " + i + ": " + waitingList[i].getShipName() + " " + waitingList[i].getShipSize());
        }
    }
}
}

Трудно понять, о чем вы спрашиваете. Пожалуйста, проверьте здесь, как задавать хорошие вопросы: stackoverflow.com/help/how-to-ask

rainer 04.04.2018 14:25

После заполнения первого массива объект добавляется ко второму массиву (waitList []), но он может добавить только один объект, тогда он сообщает, что он заполнен. Он должен иметь возможность добавить 10 объектов, но может добавить только один

S.smith94 04.04.2018 14:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

public static void waitingList(String name, String size){
    System.out.println("Dock 1 is full, ship will try to be added to Waiting List");
     for (int i = 0; i < waitingList.length; i++) {
         if (waitingList[i] == null) {
                //Add ship to the dock
                waitingList[i] = new Ship(name, size);
                System.out.println("Enough space. Added to waiting list.");
                return;
         } else {
                System.out.println("No space on waiting list at number "+ i +", checking next space."); //Optional
         }
     }
     // Only when no spaces available
     System.out.println("No space on waiting list, ship turned away.");
}

если вы добавите корабль в массив waitingList, он больше никогда не будет нулевым, так что проверка (if waitingList[0] == null) приведет к выполнению части else, где это return, поэтому цикл не будет продолжен и никогда не будет пытаться проверить if waitingList[1] == null.

Итак, выход из метода состоит в том, чтобы выйти из метода, когда корабль добавлен в список, а не когда мы увидим первое использованное пространство. Так что замена return поможет.

Да, спасибо, я знаю, в чем проблема, просто не знал, как изменить это, чтобы разрешить более одного объекта

S.smith94 04.04.2018 14:33

@ S.smith94 просто удалите возврат, и цикл продолжится. Если это было полезно, помните, отметьте его как правильный ответ. Спасибо!

Carlos López Marí 04.04.2018 14:37

Это работает при добавлении, но продолжает выходить из цикла. Мне нужно что-то изменить в инструкции if

S.smith94 04.04.2018 14:54

@ S.smith94 Я забыл добавить возврат в часть if true. Проверь это сейчас. Условие if правильное.

Carlos López Marí 04.04.2018 14:57

Независимо от того, что я делаю, я все время получаю «В списке ожидания нет места, корабль отвернулся. Достаточно места добавлено в список ожидания»

S.smith94 04.04.2018 15:01

он должен только сказать "Достаточно места добавлено в список ожидания"

S.smith94 04.04.2018 15:02

Что-то нужно изменить внутри if (waitList [i] == null)

S.smith94 04.04.2018 15:04

@ S.smith94 Вы получаете «нет места», потому что он проверяет первый, затем следующий, пока не достигнет пустого. Просто измените печать на это: System.out.println («Нет места в списке ожидания под номером« + i + », проверка следующего места.»); Если вы хотите отображать его ТОЛЬКО, когда НЕТ пустых мест, вы должны использовать логическое значение для контиции. Позволь мне сделать это.

Carlos López Marí 04.04.2018 15:06

@ S.smith94 Проверьте сейчас. Есть необязательный отпечаток, который вам может не понравиться.

Carlos López Marí 04.04.2018 15:11

Это прекрасно, спасибо большое! Я ценю его.

S.smith94 04.04.2018 15:18

Другие вопросы по теме