Почему мой алгоритм не проверяет последний элемент связного списка? - PullRequest
0 голосов
/ 08 мая 2018

Я сделал небольшую систему, которая занимает сиденьеСчет, чтобы заполнить кинотеатр определенным количеством мест (без рядов). Теперь я создал метод, который заполняет места и возвращает карту, карта возвращает место, в котором определенное количество мест свободно (например, 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;
}

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

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

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

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

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

0 голосов
/ 08 мая 2018

Ну, ваш цикл не добавляет последнюю группу последовательных мест, если эта группа включает в себя последний элемент 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;
...