Если у меня есть несколько стеков, у которых есть порядок, как я могу наилучшим образом выполнить их, чтобы найти нужное место? - PullRequest
0 голосов
/ 27 декабря 2018

Я моделирую автостоянку на Java.

У меня есть три стека, которые представляют свободные пятна разных размеров в моем классе автостоянки.

 public class CarPark {
    Stack<Spot> smallSpots;
    Stack<Spot> mediumSpots;
    Stack<Spot> largeSpots;

Класс Spot содержит глобальныйпеременная SpotSize, которую я определил как enum:

public enum SpotSize {
    Small,
    Medium,
    Large,
}

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

Транспортные средства могут быть трех размеров, также маленькие, средние или большие.Транспортное средство маленького размера может поместиться в пятно любого размера, транспортное средство среднего размера может поместиться в пятно среднего или большого размера, а транспортное средство большого размера может поместиться только в пятно большого размера.

У меня вопрос, какой самый эффективный способ (с точки зрения как производительности, так и количества написанного кода) проверки каждого из стеков данного транспортного средства?

Я действительно не хочу делатьчто-то вроде этого:

if(vehicle.getSize().equals(VehicleSize.Small)){
//check small spots
//check medium spots
//check large spots
}

if(vehicle.getSize().equals(VehicleSize.Medium)){
//check medium spots
//check large spots
}


if(vehicle.getSize().equals(VehicleSize.Large)){
//check large spots
}

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

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Предположение: VehicleSize определяется в естественном порядке:

public enum VehicleSize {
    SMALL, MEDIUM, LARGE;
}

Тогда может быть List<Stack<Spot>> spotSizes, где индекс каждого элемента относится к порядковому значению VehicleSize, например,spotSizes.get(1) относится к стеку VehicleSize.MEDIUM пятен.

List<Stack<Spot>> = new ArrayList<>(VehicleSize.values().length);
// ... init each stack, and need something to indicate how many spots are available for that VehicleSize

public boolean isParkingSpotAvailable(Vehicle v) {
    for (int size = v.getSize().ordinal(); size < VehicleSize.values().length; size++) {
        if (spotSizes.get(size) available spots > 0) {
           return true;
        }
    }
        return false;
}

Поэтому, если добавлен SUB_COMPACT (должен быть в естественном порядке):

public enum VehicleSize {
    SUB_COMPACT, SMALL, MEDIUM, LARGE;
}

, тогда isParkingSpotAvailable() будетне надо менять.Но все равно должен быть какой-то способ инициализации связанного стека, возможно, в файле свойств:

 SUB_COMPACT.available.spots=12
 SMALL.available.spots=24
 MEDIUM.available.spots=100
 LARGE.available.spots=42
0 голосов
/ 27 декабря 2018

Вы могли бы реализовать этот (конкретный) случай, используя переключение и возврат переключателя:

switch (vehicle.getSize()) {
case VehicleSize.Small:
  // check small spots, return if found
case VehicleSize.Medium:
  // check medium spots, return if found
case VehicleSize.Large:
  // check large spots, return if found
}

Не должно быть операторов break, поэтому, если небольшая выборочная проверка не удалась для небольшогомашина, средние пятна проверяются рядом, и так далее.После switch вы можете выдать ошибку или вернуть null, чтобы указать, что место не найдено.

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