【发布时间】:2018-12-20 21:01:32
【问题描述】:
我在家庭作业中被这个问题困扰了很长时间,非常感谢您的专业帮助。 我需要模拟填充用于“火星任务”的火箭,其中各种物品已经排列在数组列表中。每个火箭包括货物的最大重量是给定的(18,000 Kg),以及火箭净重(10,000 Kg)和每个项目的重量(项目对象包括字段“重量”和“项目类型”,例如“建筑材料”、“水”等。)
说明是填充每个火箭直到它完全加载,然后才能创建另一个。我的同学似乎忽略了这条指令,所以他们的代码无济于事。
按照权重升序/降序对数组进行排序并不能解决问题。
我的问题是,尽管我已经使用了 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;
}
【问题讨论】:
-
你确定你正确使用了迭代器吗?如果您不调用 iterator.next(),iterator.hasNext() 将始终为真。并且您使用 remove 修改支持集合,这将导致 ConcurrentModificationException。那个索引是干什么用的?您的代码根本没有任何意义,因为您混淆了循环概念。请看Iterator。
-
@Meini 我什么都不确定。这是我的第一个迭代器,在 whiles 和 ifs 失败之后。索引 i 用于检索列表中每个项目的权重,之前已经增加,但这也无济于事。我一直在尝试很多方法来解决这个问题,所以难怪这看起来很乱。另外我真的是一个初学者,我自己学习,从这个网站也学到了很多东西。感谢您的反馈...
-
您需要使用迭代器吗?使用增强的 for 循环使事情变得更容易编写和阅读:
for (Item item : items) { /* do stuff with current item, or break to exit */ } -
@tucuxi,不,不一定。绝望地尝试过......他们实际上在课程中说循环遍历 ArrayList 的最佳方法是通过“for”循环。会试试你的增强版。
标签: java while-loop