Почему мой алгоритм не проверяет последний элемент связанного списка?

Я сделал небольшую систему, которая использует seatCount, чтобы заполнить кинотеатр определенным количеством мест (без рядов). Теперь я создал метод, который заполняет места и возвращает карту, карта возвращает то положение, в котором определенное количество мест является свободным (например, 3-2 означает, что есть два места рядом друг с другом, начиная с места 3.

Это работает очень хорошо, но если, например, я говорю, что есть максимум 5 мест, а место 5 свободно, метод не возвращает его на карту.

Вот используемый код:

Место объекта

public class Seat {
    public Integer availability;
    public Integer seatNumber;

    public boolean IsFree() {
        if (availability == 0){
            return true;
        }
        else return false;
    }

    public String toString() {
        return "{ " + seatNumber + ", free: " + IsFree() + " } ";
    }
}

Этот метод создает LinkedList и заполняет доступность цифрами «1» (принято) или «0» (доступно) с помощью метода giveRandomAvailability ().

static LinkedList fillList(int seats){

    LinkedList<Seat> list = new LinkedList<Seat>();
    seats = seatCount;

    for(int i = 0; i < seats; i++){
        Seat seat = new Seat();
        seat.availability = giveRandomAvailability();
        seat.seatNumber = (i + 1);
        list.add(seat);
    }

    return list;
}

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

[{ 1, free: true } , { 2, free: true } , { 3, free: false } , { 4, free: true } , { 5, free: true } ]
{1=2}

Вы можете видеть, что первая часть обработана хорошо, но она также должна содержать 4 = 2.

Метод:

static Map fillSeats(){
    int n = 3;
    LinkedList<Seat> newList = fillList(seatCount);
    int consecutiveLength = 0; // Consecutive free seats length
    int index = 0;
    int startIndex = -1; // Store the start of consecutive free seats
    System.out.println(newList.toString());
    Map<Integer, Integer> consecutiveMap = new HashMap<>(); // Store startIndex -> length

    for (Seat seat : newList) {
        if (seat.IsFree()) {
            if (startIndex < 0) {
                startIndex = index;
            }
            consecutiveLength ++;
        } else {
            consecutiveMap.put(startIndex + 1, consecutiveLength);
            if (consecutiveLength == n) {
                // Found, do something here
            }
            // Reset
            startIndex = -1;
            consecutiveLength = 0;
        }
        index++;
    }
    return consecutiveMap;
}

Я не могу найти здесь проблему, помощь будет очень признательна.

Не относится к моему ответу ниже, но есть несколько советов по улучшению кода: я не думаю, что эти методы должны быть статическими. IsFree должен начинаться со строчной буквы, а возвращаемые значения также должны включать общие типы.

Jeroen Steenbeeke 08.05.2018 11:21

Спасибо @JeroenSteenbeeke, советы всегда приветствуются, я еще новичок.

user8827176 08.05.2018 11:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ну, ваш цикл не добавляет последнюю группу последовательных мест, если эта группа включает последний элемент List. Вы должны добавить логику после цикла, чтобы добавить эту последнюю группу:

for (Seat seat : newList) {
    if (seat.IsFree()) {
        if (startIndex < 0) {
            startIndex = index;
        }
        consecutiveLength ++;
    } else {
        consecutiveMap.put(startIndex + 1, consecutiveLength);
        if (consecutiveLength == n) {
            // Found, do something here
        }
        // Reset
        startIndex = -1;
        consecutiveLength = 0;
    }
    index++;
}
// added logic:
if (startIndex >= 0) {
    consecutiveMap.put(startIndex + 1, consecutiveLength);
}
return consecutiveMap;

Ваш вызов consecutiveMap.put существует только в предложении else вашего цикла, и поскольку последний элемент в вашем списке свободен, этот код никогда не выполняется для последних двух мест.

  1. seat.IsFree() == true, счетчик приращения
  2. seat.IsFree() == true, счетчик приращения
  3. seat.isFree() == false, добавить значение на карту, сбросить счетчик
  4. seat.isFree() == true, счетчик приращения
  5. seat.isFree() == true, счетчик приращения

Затем цикл завершается, поэтому последний счетчик не добавляется к вашей карте.

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