簡體   English   中英

在具有可選返回類型的方法中返回 hashmap

[英]Returning a hashmap in a method with Optional return type

根據我的分配說明,我花了很多時間制作此代碼,以使用 HashMap 分配某個插槽值(當我在此方法之外測試代碼時,代碼按預期工作)。 但是我剛剛注意到,我必須在其中實現此代碼的方法是可選的(方法本身不能修改,但我可以添加其他方法)。

現在,如果我通過調用addAnOrder添加訂單,我的整個代碼都會被忽略,因為我不知道如何實際返回為每個添加訂單創建的HashMap slots的新添加值。 因此,對於我添加的每個訂單,我都從一個完全空的 HashMap 開始。

我的整個代碼現在都沒有用了嗎,因為我已經監督了這個細節? 指令 state,我這個方法的返回值必須是int givenSlot ,但是我如何為我的 HashMap 添加新值,所以在計算槽值時它們實際上被考慮在內?

public Optional<Integer> addAnOrder(Order order, int preferredSlot) {
        HashMap<Integer, Integer> slots = new HashMap<Integer, Integer>();
        int givenSlot = 0, count = 0;

        if (currentDate.equals(date)) {
            if (slots.size() < (numberOfTimeSlots + 1) * (capacityPerSlot + 1)) {
                if (!slots.containsValue(preferredSlot)) {
                    givenSlot = preferredSlot;
                    slots.put(count, preferredSlot);
                    count++;
                } else {
                    int valueCount = 0;
                    for (Integer value : slots.values()) {
                        if (value.equals(preferredSlot)) {
                            valueCount++;
                        }
                    }
                    if (valueCount <= capacityPerSlot) {
                        givenSlot = preferredSlot;
                        slots.put(count, preferredSlot);
                        count++;

                    } else {
                        int valuePlus = 0, valueMinus = 0, valueCount2 = 0, valueCount3 = 0, i = 1, j = 1;
                        boolean plus = false, minus = false;

                        for (int a = 1; preferredSlot + i < numberOfTimeSlots + 1; i++) {
                            valueCount2 = 0;
                            for (Integer value : slots.values()) {
                                if (value.equals(preferredSlot + i)) {
                                    valueCount2++;
                                    if (valueCount2 > capacityPerSlot) {
                                        break;
                                    }
                                }
                            }
                            if (valueCount2 <= capacityPerSlot) {
                                valuePlus = preferredSlot + i;
                                if (valueCount2 <= capacityPerSlot) {
                                    plus = true;
                                }
                                break;
                            }
                        }
                        for (int b = 1; preferredSlot - j > -2; j++) {
                            valueCount3 = 0;
                            for (Integer value2 : slots.values()) {
                                if (value2.equals(preferredSlot - j)) {
                                    valueCount3++;
                                    if (valueCount3 > capacityPerSlot) {
                                        break;
                                    }
                                }
                            }
                            if (valueCount3 <= capacityPerSlot) {
                                valueMinus = preferredSlot - j;
                                if (valueCount3 <= capacityPerSlot) {
                                    minus = true;
                                }
                                break;
                            }
                        }
                        if (plus == true && minus == true) {
                            if (Math.abs(preferredSlot - valuePlus) < Math.abs(preferredSlot - valueMinus)) {
                                givenSlot = preferredSlot + i;
                                slots.put(count, preferredSlot + i);
                                count++;
                                plus = false;
                                minus = false;
                            } else if (valueMinus >= 0) {
                                givenSlot = preferredSlot - j;
                                slots.put(count, preferredSlot - j);
                                count++;
                                plus = false;
                                minus = false;
                            } else {
                                givenSlot = preferredSlot + i;
                                slots.put(count, preferredSlot + i);
                                count++;
                                plus = false;
                                minus = false;
                            }
                        } else if (plus == true && minus == false) {
                            givenSlot = preferredSlot + i;
                            slots.put(count, preferredSlot + i);
                            count++;
                            plus = false;
                        } else if (minus == true && plus == false && valueMinus >= 0) {
                            givenSlot = preferredSlot - j;
                            slots.put(count, preferredSlot - j);
                            count++;
                            minus = false;
                        } else {
                            return Optional.empty();
                        }
                        return Optional.of(givenSlot);
                    }
                    return Optional.of(givenSlot);
                }
                return Optional.of(givenSlot);
            }
            return Optional.empty();
        }
        return Optional.empty();
    }

我認為您可以添加 getSlotsMap() 方法來檢索 map,您將在應用程序初始化代碼中的某些位置對其進行初始化。

public Optional<Integer> addAnOrder(Order order, int preferredSlot){
    HashMap<Integer, Integer> slots = getSlotsMap();
    //do your thing
    return Optional.empty();
}
public HashMap<Integer, Integer> getSlotsMap(){
    //add logic to get the map from some object
    return null;
}

編輯:根據 OP 作者的輸入修改了答案。

暫無
暫無

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

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