【发布时间】:2020-06-08 13:49:15
【问题描述】:
我有以下带有构造函数、getter 和 setter 的 java 类。
public class Train implements Comparable< Train >{
private String power; // "steam", "diesel" or "electric"
private int numPassengers; // total number of passengers
private Wagon freight; // linked list of freight wagons; does not include passenger carriages;
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
public int getNumPassengers() {
return numPassengers;
}
public void setNumPassengers(int numPassengers) {
this.numPassengers = numPassengers;
}
public Wagon getFreight() {
return freight;
}
public void setFreight(Wagon freight) {
this.freight = freight;
}
@Override
public int compareTo(Train o) {
return new Integer(this.getNumPassengers()).compareTo(new Integer(o.getNumPassengers()));
}
public Train(String power){
setPower(power);
setNumPassengers(0);
setFreight(null);
}
public Train(String power, int pass){
setPower(power);
setNumPassengers(pass);
setFreight(null);
}
}
还有另一个类,火车类使用的货车。
class Wagon {
private String cargo; // e.g. "wheat"
private int weight; // weight of the cargo in tonnes
private Wagon next; // the wagon that follows this one in the train; or null if there isn't one
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Wagon getNext() {
return next;
}
public void setNext(Wagon next) {
this.next = next;
}
public Wagon(String cargo, int weight) {
setCargo(cargo);
setWeight(weight);
setNext(null);
}
public Wagon(String cargo, int weight, Wagon next) {
setCargo(cargo);
setWeight(weight);
setNext(next);
}
}
我像这样初始化一列新火车:
Train trainC2 = new Train("steam", 0);
trainC2.setFreight(new Wagon("wheat", 400, new Wagon("wheat", 300, new Wagon("maize", 280))));
我想编写一个方法,将火车作为输入,遍历货车, 如果货物属性与提供的字符串匹配,则删除货车。 我已经编写了这个方法,它创建了一个新的链表并将火车车厢添加到其中。 然后它遍历这个列表并删除任何匹配项。 我正在尝试再次遍历修改后的列表并使用 setFreight 方法更新 实际的火车对象。
public static void removeWagons(Train train, String cargo) {
LinkedList<Wagon> wag8 = new LinkedList<Wagon>();
wag8.add(train.getFreight());
ListIterator<Wagon> iter = wag8.listIterator();
Wagon currentWagon = null;
while (iter.hasNext()) {
currentWagon = iter.next();
System.out.println();
if (currentWagon.getCargo() == cargo) {
System.out.println("wag8b4" + wag8);
iter.remove();
System.out.println("wag8" + wag8);
}
}
while (iter.hasNext()) {
train.setFreight(iter.next());
}
}
我想我已经接近了,但不知道如何编写会产生如下输出的方法:
trainC2.setFreight(new Wagon("wheat", 400, new Wagon("wheat", 300, new Wagon("maize", 280))));
或者也许有更好的方法?
【问题讨论】:
-
令人困惑——您是否需要通过货运分类或制作独特的货车,或者您的火车可以有 3 个食品货车?排序的一种方法是插入已排序。另一种是冒泡排序,将货车移动到最前面(如果最少),将剩余的火车运走。
-
C/C++ 可以克服的一个不规则 JAVA(**node)是第一个 wagon 挂在 list 类上,而其他 wagon 挂在 wagon 类上,所以删除/更新首先是不规则的。解决这个问题的一种方法是在那里有一辆假货车(煤招标?:D)。在遍历列表时,您有 2 个参考,即先前的货车和当前的货车,因此您可以将当前的下一辆货车挂在前一辆货车上。你甚至可以返回移除的 wagon,有点像 pop()。
-
我不需要排序什么的,我只需要移除与指定字符串匹配的货物的货车。
-
我认为,如果不是每辆货车都持有另一辆货车,而火车只持有第一辆货车,而是火车持有它所持有的所有货车的 ArrayList/LinkedList,那么它会更容易和更清晰。然后 wagon 类中的下一个方法和字段将被删除,setFreight 将变为 addFreight 和 removeFreight。
标签: java