【问题标题】:Java - Remove Items From Linked ListJava - 从链接列表中删除项目
【发布时间】: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


【解决方案1】:

您没有对 Wagons 进行迭代,因为当您调用 wag8.add(train.getFreight()) 时,现在您的列表中只有一个 Wagon。我的建议是在你的Wagon 类中编写一个名为'hasNext()' 的方法,这样你就可以知道是否有另一个Wagon 连接到当前的货车。像这样的:

public boolean hasNext(){
    return next!=null;
}

您似乎想从火车中间删除一些货车。假设您要删除第三辆货车。为此,您可以将第二辆货车的“下一个”引用更改为指向第四辆货车。那你就没有第三辆马车了!

public static void removeWagons(Train train, String cargo) {
    // First we check the freight is not the matching wagon.
    // If it is we will ignore it
    Wagon freight = train.getFreight();
    Wagon currentWagon = train.getFreight();
    while(currentWagon.getCargo().equals(cargo)){
        freight= currentWagon.next;
        currentWagon=currentWagon.next;
    }
    //We make another wagon to hold a reference to the previous wagon
    Wagon previous=currentWagon;
    //Now the first wagon is alright. So "currentWagon" don't need to be the first
    currentWagon=currentWagon.next;
    
    do{
        if (currentWagon.getCargo().equals(cargo)){
            previous.next=currentWagon.next;
            currentWagon= currentWagon.next;
            continue;
        }
        previous= currentWagon;
        currentWagon= currentWagon.next;
            
    } while(currentWagon.hasNext())
    train.setFreight(freight);
}

代码的某些部分不明确。所以不要犹豫,问它是如何工作的。

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多