застрял с неисправной во время цикла - PullRequest
0 голосов
/ 20 декабря 2018

Я застрял с этой проблемой в домашней работе в течение длительного времени, был бы признателен за вашу профессиональную помощь.Мне нужно смоделировать заполнение ракет, предназначенных для «миссии на Марс» всеми видами предметов, уже расположенных в списке массивов.Максимальный вес каждой ракеты, включая груз, равен заданному (18 000 кг), а также весу нетто ракеты (10 000 кг) и весу каждого предмета (объект Item включает в себя поля «weight» и «itemType», например «building material», «»вода "и т.д.Кажется, мои сокурсники проигнорировали эту инструкцию, поэтому их код не может помочь.

Сортировка массива в порядке возрастания / убывания по весу не решает проблему.

Моя проблема в том, что хотя яиспользовав все время циклы while, ракеты отказываются заполняться, несмотря на то, что остается место, которое можно заполнить элементом, оставшимся в списке.Цикл не пропустит следующие 2-3 элемента (самое большее, что мне удалось получить - пропустить один элемент) и не найдет один элемент, который еще можно загрузить.

Ниже также указан список элементов.

public ArrayList<U1> loadU1(ArrayList<Item> items) {

    ArrayList<U1> fleetU1 = new ArrayList();

    int i = 0;

    Iterator<Item> iterator = items.iterator();
    while (iterator.hasNext()) {

        U1 rocketU1 = new U1(); // create new rocket with zero cargo

         while (rocketU1.canCarry(items.get(i))) { // "canCarry" checks if item's weight fits in:

/* public final boolean canCarry(Item cargo){
        if(currentRocketWeight + cargo.weight <= maxRocketWeight){
            return true;
        } else {
            return false; }} */


 rocketU1.carry(items.get(i));

// "carry" updates rocket total weight - no more than 18000 Kg including rocket net weight 10000 Kg, i.e. max cargo weight is 8000 Kg:

/* public final int carry(Item cargo){
           currentRocketWeight += cargo.weight;
           return currentRocketWeight;}
      */
           items.remove(i); // remove loaded item from list

          }

        fleetU1.add(rocketU1); // add rocket to fleet
    }

    return fleetU1;
}

/*arraylist "items" - "phase-1.txt":

building tools=2000
building tools=2000
building tools=2000
building tools=5000
building tools=5000
building tools=2000
building tools=1000
building tools=5000
building tools=6000
shelter equipment=5000
construction equipment=5000
plants=1000
steel=8000
books=1000
water=5000*/

public ArrayList<Item> loadItems(int phaseNum) {

try {
        switch (phaseNum) {
            case 1:
                out.println("Loading phase 1:");
                fileName = "phase-1.txt";
                break;
            case 2:
                out.println("Loading phase 2:");
                fileName = "phase-2.txt";
                break;
            default:
            out.println("argument must be 1 or 2");
        }

        File file = new File(fileName);
        Scanner scanner = new Scanner(file);

        while (scanner.hasNextLine()) {
            lineFromFile = scanner.nextLine();

            String[] list = lineFromFile.split("=");
            Item item = new Item(); //(list[0], );
            item.itemType = list[0];
            item.weight = Integer.parseInt(list[1]);

            itemList.add(item); // create ArrayList of items
        }

        scanner.close();

    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return itemList;

}

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вам нужно перебрать предметы для каждой ракеты.

// create a copy of the items so we can remove without harm to the caller
List<Items> ourList = new ArrayList<>(items);
// you should probably sort the list by weight, descending order

while (!ourList.isEmpty()) {
    // we need a rocket.
    U1 rocket = new U1();
    // go through all the items and load if item fits
    Iterator<Item> iterator = ourList.iterator();
    while (iterator.hasNext()) {
        // the next() call that's mentioned in the comment
        Item item = iterator.next();
        if (rocket.canCarry(item)) {
            rocket.carry(item);
            // you need to remove from the iterator itself, not from the list
            // or you will get an exception because that makes the iterator invalid
            // it will remove from the underlying list as well though
            iterator.remove();
        }
    }
    fleet.add(rocket);
}
0 голосов
/ 20 декабря 2018

Итак, что бы я сделал:

Для каждого предмета я бы попытался поместить его в ракету уже во флоте;если бы не было возможности, я бы добавил новую ракету во флот.Если элемент не помещается даже в пустую ракету, он сохраняется в списке ввода, в противном случае он удаляется:

public List<U1> loadU1(List<Item> items) {
    List<U1> fleetU1 = new ArrayList<>();
    Iterator<Item> iterator = items.iterator();
    while (iterator.hasNext()) {
        Item item = iterator.next();
        U1 rocketU1 = null;
        for (U1 u1: fleetU1) {
            if (u1.canCarry(item)) {
                rocketU1 = u1;
                break;
            }
        }
        if (rocketU1 == null) {
            rocketU1 = new U1();
            if (!rocketU1.canCarry(item)) {
                // the item is too heavy
                continue;
            }
            fleetU1.add(rocketU1);
        }
        rocketU1.carry(item);
        iterator.remove();
    }
    return fleetU1;
}
0 голосов
/ 20 декабря 2018

У вас должен быть один метод для заполнения ракеты, а затем вызывать этот метод в цикле, пока еще есть груз для загрузки.Чтобы сделать это без рекурсивных вызовов, я изменил массив ракет `fleet ', чтобы он стал членом класса

private List<Item> loadRocket(List<Item> items) {        
    Iterator<Item> iterator = items.iterator();
    List<Item> loaded = new ArrayList<>();
    U1 rocketU1 = new U1();

    while (iterator.hasNext()) {
        Item item = iterator.next();
        if (rocketU1.canCarry(item)) {
            rocketU1.carry(item);
            loaded.add(item);
        } 
    }
    items.removeAll(loaded);
    fleetU1.add(rocketU1);
    return items;
}

, а затем вызову его в цикле

while (!items.isEmpty()) {
    items = loadRocket(items);
}

Есливы не хотите иметь флот as a class member you could move the creation of the rocket and adding to the флота list to outside of ´loadRocket и вместо этого отправлять его в качестве параметра.

while (!items.isEmpty()) {
    U1 rocket = new U1();
    items = loadRocket(rocket, items);
    fleet.add(rocket);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...