我有一个名为“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;
有人可以解释一下这里发生了什么吗?为什么我不能以这种方式访问我的士兵对象以及访问它们的正确方法是什么?
答案 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];
当您尝试访问阵列中的第一个“Soldier”元素时,最好的方法是使用
arrayName.get(index);
方法。 “get(索引i处的元素)方法是Array类的方法。