创建正确的循环结构以填充对象列表

时间:2018-01-14 15:17:07

标签: java loops object arraylist populate

我有一个对象列表,每个对象都有两个字段,名称和重量。我需要填充并计算那些列表中的权重,这些权重将满足其他对象列表中对象的参数,但是只有当权重总和不超过最大值时才必须创建这些新对象,然后它移动on,计算从第一个列表到最大值的另一个权重,然后为另一个列表创建一个带有所需参数的对象,这就是它在代码中的样子。

这是第一个清单:

[Item{name='building tools', weight=2000}, Item{name='building tools', weight=2000}, Item{name='building tools', weight=2000}, Item{name='building tools', weight=5000}, Item{name='building tools', weight=5000}, Item{name='building tools', weight=2000}, Item{name='building tools', weight=1000}, Item{name='building tools', weight=5000}, Item{name='building tools', weight=6000}, Item{name='shelter equipment', weight=5000}, Item{name='construction equipment', weight=5000}, Item{name='plants', weight=1000}, Item{name='steel', weight=8000}, Item{name='books', weight=1000}, Item{name='water', weight=5000}]

现在我正在创建一个循环,将权重转换为单独的变量,直到小于8000,然后我需要填充其他对象列表,其中一个参数是这些项的权重,它不能大于8000 ,这就是代码中的样子:

 public List<Rocket> loadU1(List<Item> items) {

        List<Rocket> u1Rockets = new ArrayList<>();
        for (int i = 0; i < items.size(); i++) {
            if ( testWeight + items.get(i).getWeight() <= 8000) {
                testWeight += items.get(i).getWeight();
            } else {
                u1Rockets.add(new U1(120, 10000, 18000, testWeight));
                testWeight = 0;
            }
    }
    return u1Rockets;

}

testWeight是计算变量,它是类中的全局int变量。新的u1Rocket的构造函数除了最后一个参数之外都是静态的,它的权重不能超过8000.当我运行loadU1时,这是它看起来如何填充:

[U1{cost=120, weight=10000, maxWeight=18000, weightOfCargo=6000}, U1{cost=120, weight=10000, maxWeight=18000, weightOfCargo=8000}, U1{cost=120, weight=10000, maxWeight=18000, weightOfCargo=6000}, U1{cost=120, weight=10000, maxWeight=18000, weightOfCargo=6000}]

它工作得很好,直到i = 3,然后它当然将testWeight设置为0,所以它可以计算它但是然后没有创建一个新的火箭对象5000应该因为5000之后的那个( i = 4)也是超过限制的5000,所以它应该为这个创建单独的Rocket 5000,然后当然继续...我试图调试它但是找不到我身边的确切逻辑问题在哪里,谢谢。

所以这是我的Rocket类,

public class Rocket implements Spaceship {
    private int price;
    private int weight;
    private int weightOfCrago;
    private int maxWeight;

    public Rocket(int price, int weight, int weightOfCrago, int maxWeight) {
        this.price = price;
        this.weight = weight;
        this.weightOfCrago = weightOfCrago;
        this.maxWeight = maxWeight;
    }

    public Rocket() {
    }

    @Override
    public boolean launch() {
        return true;
    }

    @Override
    public boolean land() {
        return true;
    }

    @Override
    public boolean canCarry(Item item) {
        if ((item.getWeight() + weightOfCrago) <= (maxWeight - weight)){
            return true;
        }else {
            return false;
        }

    }

    @Override
    public void carry(Item item) {
        maxWeight += item.getWeight();

    }

例如,无论如何在我之前发布的循环中创建之前使用canCarry方法以防止创建超出限制的新Rocket对象? U1是火箭的孩子。

1 个答案:

答案 0 :(得分:0)

问题是当火箭已满时,你的代码只会跳过当前检查的项目。

解决这个问题的最快方法是在创建火箭时返回跳过的位置(因此i--)。但是你也总是跳过最后一个桶,所以你仍然必须添加它。参见:

for (int i = 0; i < items.size(); i++) {
    if (testWeight + items.get(i).getWeight() <= 8000) {
        testWeight += items.get(i).getWeight();
    } else {
        u1Rockets.add(new U1(120, 10000, 18000, testWeight));
        testWeight = 0;
        // re-check the skipped item
        i--;
    }
}

// add the last rocket
u1Rockets.add(new U1(120, 10000, 18000, testWeight));

请注意,您手边有bin packing problem的变体,这是NP完全问题。