我有一个对象列表,每个对象都有两个字段,名称和重量。我需要填充并计算那些列表中的权重,这些权重将满足其他对象列表中对象的参数,但是只有当权重总和不超过最大值时才必须创建这些新对象,然后它移动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是火箭的孩子。
答案 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完全问题。