Java 生成堆栈数组时出错

Java 生成堆栈数组时出错,java,arrays,stack,Java,Arrays,Stack,我正在用Java做一个项目(我很新) 我试图创建两个数组,它们引用一组相似的对象(索引3-16)和相应的3(索引0-2)。我希望对象是堆栈(我将其更改为“Pile”,它只有一个报告其长度的方法)。每个“堆”对象都将准备好接受“块”对象 Pile[]leftBoard=新桩[16]; 桩[]右板=新桩[16]; 对于(int i=3;i

我正在用Java做一个项目(我很新)

我试图创建两个数组,它们引用一组相似的对象(索引3-16)和相应的3(索引0-2)。我希望对象是堆栈(我将其更改为“Pile”,它只有一个报告其长度的方法)。每个“堆”对象都将准备好接受“块”对象

Pile[]leftBoard=新桩[16];
桩[]右板=新桩[16];
对于(int i=3;i<16;i++){
左板[i]=新桩();
右板[i]=左板[i];
}
对于(int i=0;i<3;i++){
左板[i]=新桩();
}
对于(int i=0;i<3;i++){
右板[i]=新桩();
}
请帮忙!谢谢

Pile[]
是泛型数组,这是一件非常糟糕的事情™. 相反,请尝试以下方法:

// 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>());
}
因此,您可以操纵列表中的对象,但不能修改它们在列表中的位置或列表本身的内容。想象一下一个被封锁的监狱——没有人进出,但你仍然可以与囚犯交谈

如果您希望
s保持在原来的位置,但能够移动
s,我觉得一个不可修改的列表不错。只要您有一个类似于
somePile.setPiece(somePiece)
的方法,它就可以正常工作。

Pile[]
是一个泛型数组,这是一件非常糟糕的事情™. 相反,请尝试以下方法:

// 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>());
}
因此,您可以操纵列表中的对象,但不能修改它们在列表中的位置或列表本身的内容。想象一下一个被封锁的监狱——没有人进出,但你仍然可以与囚犯交谈


如果您希望
s保持在原来的位置,但能够移动
s,我觉得一个不可修改的列表不错。只要您有一个类似于
somePile.setPiece(somePiece)
的方法,这应该可以正常工作。

您将堆栈更改为桩是什么意思?
Pile
实际上是指
java.util.Stack
?将堆栈更改为piles是什么意思?
Pile
实际上是指
java.util.Stack
?我应该如何编辑leftBoard[I]=new Pile();部件?顺便说一下,您不必使用
新ArrayList(16)
实例化;尺寸是可选的,但是如果你知道它的性能会稍微好一点。凯,太好了,谢谢!它不应该是可变的大小,虽然我想要的。再次感谢你!没问题。最后,如果你想要一个不可修改的列表(你仍然可以修改元素本身,但不能添加/删除/设置/等等),你可以使用
集合。不可修改列表(leftBoard)
。我想能够在工件对象周围移动,但不能移动堆,它们应该保持在原位。我应该如何编辑leftBoard[I]=new Pile();部件?顺便说一下,您不必使用
新ArrayList(16)
实例化;尺寸是可选的,但是如果你知道它的性能会稍微好一点。凯,太好了,谢谢!它不应该是可变的大小,虽然我想要的。再次感谢你!没问题。最后,如果你想要一个不可修改的列表(你仍然可以修改元素本身,但不能添加/删除/设置/等等),你可以使用
集合。不可修改列表(左板)
。我希望能够在工件对象周围移动,但不能在堆上移动,它们应该保持在原位。
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