Алгоритм упаковки First-Fit Bin

Я пытаюсь сделать упаковку бункера First-Fit. Это код, который я написал с пояснениями для каждой строки в виде комментариев:

private void runFirstFit(ActionEvent event) {
    // The counters
    int i;
    int j = 0;

    // The boolean
    packingComplete = false;

    // Declare an arrayList from the numbers the user has entered
    ArrayList<Integer> numbers = new ArrayList(6);

    // Add numbers into the array from input (using a loop)
    for (i = 0; i < 6; i++) {
        numbers.add(parseInt(getNumber(i)));
    }

    // - Main packing algorithm starts here -
    // Iterate through arraylist and get next number
    Iterator<Integer> iterator = numbers.iterator();

    // While there are still numbers left, try and add to bins
    while (iterator.hasNext()) {
        // Number(s) still exist in the list
        // Check if number can fit inside bin
        System.out.println("Number currently in queue: " + iterator.next());

        if (canNumberFitInsideBin(j, iterator.next())) {
            // Put number inside bin
            bin[j] += String.valueOf(iterator.next()) + ", ";

            System.out.println("Number added to bin " + j);
        } else {
            // Bin is full, move to the next bin (increment counter)
            j++;

            // Put number inside that bin
            bin[j] += String.valueOf(iterator.next()) + ", ";

            System.out.println("Counter incremented");
        }
    }

    // Update all labels
    updateAllBinLabels();
}

В основном, getNumber(i) Часть - это функция, которая возвращает число. Я использую цикл, чтобы добавить фактические числа (6 из них, чтобы быть более конкретными) в ArrayList, называемый "числа".

Я пытался распечатать номер на каждом этапе и посмотреть, с каким номером он имеет дело - но кажется, что он просто случайно пропускает некоторые цифры без причины. Например, с вводом ArrayList 1,2,3,4,5,6 первый номер, который он добавляет к bin[0] является 3 (который должен быть 1), а затем добавляет 6 в bin[0] и вид игнорирует все остальные числа и переход к следующему массиву bin.

Кто-нибудь может определить, что я делаю не так?

Спасибо

1 ответ

Наиболее очевидная проблема заключается в том, что iterator.next() должен вызываться только один раз для каждого входа в цикл. Каждый раз, когда вы звоните, вы продвигаетесь в своем списке. Вам нужно вызвать его один раз и сохранить во временной переменной в верхней части цикла.

Также вам, вероятно, следует проверить, что число может вписаться в следующую ячейку в другом, если вы не знаете, что ни одно из значений не превышает размер вашей ячейки.

Другие вопросы по тегам