0

我需要对象的循环列表。每个人都应该知道哪个是前一个或下一个。我这样做了:

class Bus {

    private Bus previous;
    private Bus next;

    public Bus() {
      //anything
    }

    public void setPrevious(Bus bus) {
      this.previous = bus;
    }

    public void setNext(Bus bus) {
      this.next = bus;
    }

    private void someMethod() {
     // if (previous.xxx() && next.xxx()) {
     //   do something
     // } 
    }

}

我创建了一个总线数组。在将所有总线添加到其中之后,我设置了每个元素的下一个和上一个。而且我觉得它很丑:D。你能建议我更好的方法吗?

4

4 回答 4

1

只是一个想法,但可能有一个用于节点的类和一个用于列表的类。这样,您可以为节点类创建一个构造函数来处理设置其下一个和最后一个引用。这使得列表实际上只需要担心标准列表函数,例如Add().

看一下List界面。

于 2012-01-05T22:52:50.890 回答
1

链表不需要数组。要创建列表,您需要使用下一个和上一个方法来连接您的对象并将最后一个与第一个连接(做循环)。以及使用示例(使用您的实现):

Bus one = new Bus();
Bus two = new Bus();
Bus three = new Bus();

one.setPrevious(three);
one.setNext(two);

two.setPrevious(one);
two.setNext(three);

three.setPrevious(two);
three.setNext(one);

这或多或少是链接列表循环的想法。我建议查看另一个问题以了解链接列表。做圆形很容易。

于 2012-01-05T22:53:00.437 回答
1

如果您调整您的setNextsetPrevious方法以不仅更新它们的实例,而且还设置nextprevious您想要的实例必须依赖于外部机制。

因此,假设您最初创建了Bus AB. 当你调用时A.setNext( B ),它也应该更新之前的节点B,而不必调用B.setPrevious( A )。与在 Java 中向 a 添加内容类似LinkedList,您不必手动设置最后一个对象和刚刚添加的对象之间的链接。就像是

public void setPrevious(Bus bus) {
  this.previous = bus;
  if ( bus.next != this ){
    bus.next = this;
  }
}

当然,你仍然必须考虑总线已经包含在另一个List你必须更新它的场景List

因此,将节点与其他响应之一中建议的实际总线实例分开的建议是一个更好的主意。这允许您将总线添加到多个列表中,并且可能更容易编写您的循环列表(或仅使用列表的可用实现)。这也是更好的 OO 设计,因为您可以重用您编写的列表。

于 2012-01-05T23:24:47.893 回答
0

为什么需要数组?您已经拥有每个对象中的引用。

于 2012-01-05T22:54:04.460 回答