将计划项添加到多槽制作队列

时间:2016-04-30 10:08:27

标签: java android

我正在开发Android游戏。

游戏中的区域有精心设计的插槽,可以确定一次可以制作多少项目。如果没有可用的插槽,则会为该项目提供预定的开始日期,该日期与插槽何时可用相关。

我遇到的问题是当前代码只考虑第一个插槽何时可用,而不是任何插槽时。

添加预定项目:

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 个答案:

答案 0 :(得分:0)

最终采用了阵列方法,并取得了成功。

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();
    }
}

希望这可以帮助将来遇到类似问题的人。