【发布时间】:2021-03-24 03:44:15
【问题描述】:
我正在尝试创建一个订单系统,根据可用容量为客户分配插槽。
每天我都可以选择 numberOfSlots 和 capacityPerSlot。 在我的测试中,我选择了 3 个插槽和每个插槽 3 个容量,总共 9 个插槽。
每个客户都可以声明一个首选的槽号,在这种情况下为 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中的key和value分别代表什么?键序号和值是槽号吗?或者是关键客户编号,每个客户只能有 1 个订单?对模型的一些解释可能会有所帮助。
-
我想我可以看到您正在尝试做什么,但是您选择的数据结构确实不适合该问题。地图设计用于在给定键时轻松访问值。而您必须根据值计算条目。这不是地图的设计目的。您可以使用它们来解决问题,但最好从更好的数据结构开始。例如,从槽号到订单号列表的映射将使您的代码更简单。
-
这些值是我的插槽号,键并没有真正的意义。我只是被告知要使用 HashMap 来完成这项任务。每个客户只能有 1 个订单,但我已经事先排除了这一点,但有一个例外。我不需要订单系统的帮助,只有插槽部分,这就是我排除其他信息的原因。
-
那么为什么不使用
HashMap,其中键是槽号,值是该槽中的订单数?你写的代码会简单得多。 -
这是一个明确说明使用哪些类和方法的作业。我已经提前处理了订单。我只是在插槽部分苦苦挣扎了好几天,我的教练告诉我用 HashMap 尝试一下