Добавление запланированных элементов в очередь создания нескольких слотов

Я работаю над игрой для Андроид.

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

Проблема, с которой я сталкиваюсь, заключается в том, что текущий код учитывает только то, когда первый слот станет доступным, а не когда любой слот будет.

Добавление запланированного элемента:

long timeSlotAvailable = getTimeSlotAvailable(location);

Pending_Inventory newScheduledItem = new Pending_Inventory(itemId, state, timeSlotAvailable, quantity, craftTime, location);

Получение времени, когда слот доступен:

public static long getTimeSlotAvailable(Long location) {
    List<Pending_Inventory> pendingItems = getPendingItems(location, true);
    int locationSlots = Slot.getUnlockedSlots(location);
    long timeAvailable = System.currentTimeMillis();

    // Works for single slots, not for multi though. Needs to consider slot count.
    for (Pending_Inventory pending_inventory : pendingItems) {
        long finishTime = pending_inventory.getTimeCreated() + pending_inventory.getCraftTime();
        if (finishTime > timeAvailable) {
            timeAvailable = finishTime;
        }
    }

    return timeAvailable;
}

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

locationSlots в настоящее время не используется, но я считаю, что это будет необходимо, чтобы рассчитать правильное время слот будет доступен.

Я попробовал несколько подходов (добавление всех раз завершения в массив и получение значения n показало обещание, но я не мог обойти его), но у меня нет идей.

Спасибо!

1 ответ

  1. В конце концов, сделал еще один шаг на подходе к массиву и преуспел.

    public static long getTimeSlotAvailable(Long location) {
        List<Pending_Inventory> pendingItems = getPendingItems(location, true);
        int numSlots = Slot.getUnlockedSlots(location);
    
        // Add all of the times a slot will become available to a list
        List<Long> finishTimes = new ArrayList<>();
        for (Pending_Inventory pending_inventory : pendingItems) {
            long finishTime = pending_inventory.getTimeCreated() + pending_inventory.getCraftTime();
             finishTimes.add(finishTime);
        }
    
        // Sort these times so the latest time is first
        Collections.sort(finishTimes, Collections.<Long>reverseOrder());
    
        if (finishTimes.size() >= numSlots) {
            // If we're all full up, get the first time a slot will become available
            return finishTimes.get(numSlots-1);
        } else {
            // Otherwise, it can go in now
            return System.currentTimeMillis();
        }
    }
    

    Надеюсь, что это поможет кому-то в будущем с подобной проблемой.