【问题标题】:Creating a correct loop structure to populate a list of objects创建正确的循环结构以填充对象列表
【发布时间】:2018-06-23 09:02:44
【问题描述】:

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

这是第一个列表:

[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,超过了限制,所以它应该为这个单独创建一个带有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 是火箭的孩子。

【问题讨论】:

    标签: java loops object arraylist populate


    【解决方案1】:

    问题在于,当火箭已满时,您的代码只是跳过了当前检查的项目。

    解决此问题的最快方法是在创建火箭时返回跳过的位置(因此为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 完全问题。

    【讨论】:

    • 但是现在它为项目列表的每个重量值添加了一个新的火箭对象,这不是我想要的。我想在重量最大到 8000 之后添加它,如果不是并且下一个重量超过它,那么它会创建一个新的火箭对象......我不能以某种方式解决它,也许可以向火箭对象添加一些方法那将检查 Rocket 对象是否不超过最大限制?我将在帖子中添加一些代码。
    • 您是否可能放错了大括号?发布的代码不应该那样做。
    • 我很高兴能帮上忙 :) Please accept my answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多