为什么我无法访问数组元素?

时间:2016-01-16 12:19:46

标签: java loops

我有一个名为“Soldier”的类,我还有一个名为“Army”的类,其中包含一个Soldier类对象数组。陆军类的定义如下:

public class Army {
    Array<Soldier> army;

然后,在陆军类构造函数中,我正在创建像这样的士兵对象数组:

public Army(){
    army = new Array<Soldier>(20); // Here
}

到目前为止,我正在通过这样的军队阵列进行迭代:

for (Soldier soldier : army) {
    // do something with soldier object
}

这很好用,但是当我想以这种方式进行嵌套迭代(一个循环在另一个循环中)时,它们都搞砸了 - 内部循环正在破坏外部循环迭代器索引。

所以,我想进行“手动”迭代,使用简单的for循环,它看起来像这样:

for (int i=0; i< army.army.size; i++) {
    Soldier soldier = army.army.items[i];

但是我遇到了运行时错误(异常):

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.mgsoft.Soldier;

有人可以解释一下这里发生了什么吗?为什么我不能以这种方式访问​​我的士兵对象以及访问它们的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

而不是Array使用ArrayList,如:

  ArrayList<Soldier> army;

你将拥有:

 for (int i=0; i< army.size; i++) {
  Soldier soldier = army.get(i);

答案 1 :(得分:1)

我建议实施Iterable

public class Army implements Iterable<Soldier> {
    private final List<Soldier> soldiers;

    public Army(List<Soldier> soldiers) {
        this.soldiers = soldiers;
    }

    @Override
    public Iterator<Soldier> iterator() {
        return soldiers.iterator();
    }
}

然后你可以简单地写

for(Soldier s : army) {
     for(Soldier t : army) {
         System.out.println(s + "  " + t);
     }
 }

循环不会干扰,因为你总是从士兵的内部列表中得到一个新的迭代器。我不知道您的Array类型究竟是如何工作的,但如果它也是Iterable,您可以使用它与我使用列表的方式完全相同。

答案 2 :(得分:0)

以手动方式:

for (int i=0; i< army.size(); i++) {
  Soldier soldier = army.get(i);

如果您从ArrayList获取数据,则可以通过get方法直接获取数据。要获得ArrayList的大小,请使用listName.size()

答案 3 :(得分:0)

你的问题在于:

for (int i=0; i< army.army.size; i++) {
    Soldier s = army.army.items[i];
}

您的实施应该是:

for(int i = 0; i < army.size(); i++){
    Soldier soldier = army.get(i);
}

背后的原因,“ army.army ”不存在,因此它的大小无关紧要。

另外,在行中:

Soldier s = army.army.items[i];
“army.army”部分无效。

当您尝试访问阵列中的第一个“Soldier”元素时,最好的方法是使用

arrayName.get(index);

方法。 “get(索引i处的元素)方法是Array类的方法。