[英]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.