簡體   English   中英

檢查 Hashmap 中的下一個最高/最低值

[英]Checking for the next highest/lowest values in a Hashmap

我正在嘗試創建一個訂單系統,根據可用容量為客戶分配插槽。

每天我都可以選擇 numberOfSlots 和 capacityPerSlot。 對於我的測試,我選擇了 3 個插槽和每個插槽 3 個容量,總共 9 個插槽。

每個客戶可以 state 一個首選插槽號,在這種情況下為 0。

int numberOfSlots = 2; capacityPerSlot = 2;
int preferredSlot = 0 

對於我收到的每個訂單,我都必須檢查客戶首選插槽中是否還有剩余容量。 如果有,我將那個位置分配給他。 如果沒有,我會給他下一個具有最低索引 (+/-) 和可用容量的插槽。 如果沒有空位,我什么也不分配。

到目前為止,這是我的代碼:

int givenSlot = 0, count = 0;
HashMap<Integer, Integer> slots = new HashMap<Integer, Integer>();
Iterator iterator = slots.entrySet().iterator();
Iterator iterator2 = slots.entrySet().iterator();

if (slots.size() < (numberOfSlots + 1) * (capacityPerSlot + 1)) {
                if (!slots.containsValue(preferredSlot)) {
                    givenSlot = preferredSlot;
                    slots.put(count, preferredSlot);
                    count++;
                } else {
                    int valueCount = 0;
                    while (iterator.hasNext()) {
                        Map.Entry slot = (Map.Entry) iterator.next();
                        if (slot.getValue().equals(preferredSlot)) {
                            valueCount++;
                        }
                    }
                    if (valueCount <= capacityPerSlot) {
                        givenSlot = preferredSlot;
                        slots.put(count, preferredSlot);
                        count++;
                    } else {
                        int valueCount2 = 0;
                        int i = 1;
                        while (iterator2.hasNext()) {
                            Map.Entry slot2 = (Map.Entry) iterator2.next();
                            if (slot2.getValue().equals(preferredSlot + i)) {
                                valueCount2++;
                                if (valueCount2 > capacityPerSlot) {
                                    i++;
                                }
                            }
                        }
                        if (valueCount2 <= capacityPerSlot) {
                            givenSlot = preferredSlot + i;
                            slots.put(count, preferredSlot + i);
                            count++;
                        }
                    }
                }
            }

如果之前沒有帶有首選插槽號的訂單並且已達到首選插槽號的容量,但仍然有首選插槽 + 1 的容量,我的代碼已經可以使用。

但是,如果插槽 0 和插槽 1 的容量完全用完,我不知道如何讓我的代碼檢查插槽 2 中是否有可用性:

slots.put(100, 0);
slots.put(101, 0);
slots.put(102, 0);
slots.put(103, 1);
slots.put(104, 1);
slots.put(105, 1);

如果我添加這些“訂單”,我不會分配插槽,它應該分配插槽 2。如何讓我的代碼檢查未定義數量的下一個插槽,這些插槽仍在我選擇的范圍內預先?

我建議使用不同的數據結構。

例如:

Map<Integer,Integer> slotCounts;

可以表示從插槽號到訂單號列表的 map。

檢查插槽是否可用將是slotCounts.getOrDefault(slot, 0) < capacityPerSlot

找到下一個可用的插槽將是:

for (int slot = preferredSlot; slot < numberOfSlots; slot++) {
    int count = slotCounts.getOrDefault(slot, 0);
    if (count < capacityPerSlot) {
        slotsCount.put(slot, count + 1);
        break;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM