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




Ну, ваш цикл не добавляет последнюю группу последовательных мест, если эта группа включает последний элемент 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 вашего цикла, и поскольку последний элемент в вашем списке свободен, этот код никогда не выполняется для последних двух мест.
seat.IsFree() == true, счетчик приращенияseat.IsFree() == true, счетчик приращенияseat.isFree() == false, добавить значение на карту, сбросить счетчикseat.isFree() == true, счетчик приращенияseat.isFree() == true, счетчик приращенияЗатем цикл завершается, поэтому последний счетчик не добавляется к вашей карте.
Не относится к моему ответу ниже, но есть несколько советов по улучшению кода: я не думаю, что эти методы должны быть статическими.
IsFreeдолжен начинаться со строчной буквы, а возвращаемые значения также должны включать общие типы.