java - 创建堆栈数组时出错

标签 java arrays stack

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

我正在尝试创建两个数组,分别引用一组相似的对象(索引 3-16)和各自的 3 个对象(索引 0-2)。我希望对象是堆栈(我将其更改为“堆”,它只有一个报告其长度的方法)。每个“桩”对象都将准备好接受“片”对象。

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>();
}

请帮忙!谢谢!

最佳答案

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

因此,您可以操作列表内的对象,但无法修改它们在列表中的位置或列表本身的内容。想象一下一座被封锁的 jail - 没有人进出,但您仍然可以与囚犯交谈。

如果你想要Pile s 留在原处,但能够移动 Piece s,不可修改的列表对我来说听起来不错。只要你有像somePile.setPiece(somePiece)这样的方法,这应该可以正常工作。

关于java - 创建堆栈数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736478/

相关文章:

java - The blank final field name may not have been initialized 错误

java - 如何在 OSGi 中获取调用 Bundle 的 BundleWiring?

java - Jersey/JAX-RS ExceptionMapper MySQL

java - 如何从 Java 中的常规数组创建迭代器?

php - Mysqli fetch 仅返回一个值

c - xe166 堆栈溢出异常处理

java - 在 Qpid Proton AMQP 1.0 客户端库中设置连接的 `max_frame_size`

在 C 中将字符数组集中到单个字符数组中

c++ - 如何对堆栈中的所有项目求和?后缀计算器

c++ - 如何将 void* 存储在堆栈 C++ 容器中