制作堆栈数组的错误

时间:2013-04-01 01:28:51

标签: java arrays stack

我正在开发一个Java项目(我很新)。

我正在尝试制作两个引用相似的一组对象(指数3-16)和相应的3(指数0-2)的数组。我希望对象是堆栈(我改为“桩”,它只有一种方法来报告它们的长度)。每个“桩”对象都可以接受“Piece”对象。

Pile<Piece>[] leftBoard = new Pile[16];
Pile<Piece>[] rightBoard = new Pile[16];
for (int i = 3; i < 16; i++){
    leftBoard[i] = new Pile<Piece>();
    rightBoard[i] = leftBoard[i];
}
for (int i = 0; i < 3; i++){
leftBoard[i] = new Pile<Piece>();
}
for (int i = 0; i < 3; i++){
    rightBoard[i] = new Pile<Piece>();
}

请帮忙!谢谢!

1 个答案:

答案 0 :(得分:1)

Pile<Piece>[]是一系列泛型。 Due to type erasure in Java,这是一件非常糟糕的事情。相反,尝试这样的事情:

// Initialize arrays.
ArrayList<Pile<Piece>> leftBoard = new ArrayList<Pile<Piece>>(16);
ArrayList<Pile<Piece>> rightBoard = new ArrayList<Pile<Piece>>(16);

// Fill arrays so we can use the "set" method.
leftBoard.add(Collections.<Pile<Piece>>nCopies(null));
rightBoard.add(Collections.<Pile<Piece>>nCopies(null));

// Store values.
for (int i = 3; i < 16; i++){
    Pile<Piece> thisPiece = new Pile<Piece>();
    leftBoard.set(i, thisPiece);
    rightBoard.set(i, thisPiece);
}
for (int i = 0; i < 3; i++){
    leftBoard.set(i, new Pile<Piece>());
}
for (int i = 0; i < 3; i++){
     rightBoard.set(i, new Pile<Piece>());
}

ArrayList也更好,因为它可以动态调整大小(在许多其他方面)。

快速纲要:如果你有String[] array和`ArrayList列表,那么:

  • array[i]list.get(i)
  • 相同
  • array[i] = varlist.set(i, var)
  • 相同
  • 您可以使用list.add(var)
  • 添加元素
  • 您可以使用list.remove(index)list.remove(var)
  • 从任意位置删除元素
  • 有关详情,请参阅ArrayList documentationJava Tutorial on the subject

编辑:关于不可修改列表的主题:

List<MyObject> l = Collections.unmodifiableList(myList);
l.get(0);             // valid as long as element exists
l.get(0).foo();       // valid
l.get(0).setFoo(bar); // valid
l.remove(foo);        // INVALID
l.add(foo);           // INVALID

因此,您可以操作列表中的 对象,但不能修改列表中的位置或列表本身的内容。想象一下锁定监狱 - 没有人进出,但你仍然可以和囚犯交谈。

如果您希望Pile保留在原来的位置,但能够移动Piece,则无法修改的列表听起来不错。只要你有像somePile.setPiece(somePiece)这样的方法,这应该可以正常工作。