Java 如何在嵌套的ArrayList上执行for循环?

Java 如何在嵌套的ArrayList上执行for循环?,java,for-loop,arraylist,Java,For Loop,Arraylist,我将尽可能使这个2D渲染引擎模块化。我已经想出了一个绘制/更新精灵的优先级列表,但还没有完成,这样我就可以控制哪些精灵在彼此前面 此代码旨在循环遍历每个优先级列表并渲染该列表中的每个精灵 //I don't entirely understand what this for-each type of loop does. public static void renderSprites(ArrayList<ArrayList<AbstractSprite>> prior

我将尽可能使这个2D渲染引擎模块化。我已经想出了一个绘制/更新精灵的优先级列表,但还没有完成,这样我就可以控制哪些精灵在彼此前面

此代码旨在循环遍历每个优先级列表并渲染该列表中的每个精灵

//I don't entirely understand what this for-each type of loop does.

public static void renderSprites(ArrayList<ArrayList<AbstractSprite>> priorities){
    for (ArrayList<AbstractSprite> priority : priorities){
        for(AbstractSprite sprite : priorities.get(priority)){

           renderSprite(/* what should I reference to get the relevant sprite? */);

           //this is my best guess at what the nested loop would be, but it obviously doesn't work.
          //any ideas?
        }
    }
}
//我不完全理解每种类型的循环的作用。
公共静态无效渲染优先级(ArrayList优先级){
for(ArrayList优先级:优先级){
for(抽象精灵:优先级。获取(优先级)){
renderSprite(/*我应该引用什么来获取相关的sprite?*/);
//这是我对嵌套循环的最佳猜测,但它显然不起作用。
//有什么想法吗?
}
}
}
应该是

for (ArrayList<AbstractSprite> priority : priorities){
    for(AbstractSprite sprite : priority){
        renderSprite(sprite);
    }
}
for(ArrayList优先级:优先级){
for(抽象精灵精灵:优先级){
renderSprite(精灵);
}
}
这假定优先级arraylist按从高优先级到低优先级的顺序进行排序,因此渲染的精灵具有最高优先级


请记住,
ArrayList
get()
方法需要一个
int
,它表示要访问的元素的索引。For-each循环的实现是为了使索引对用户不透明,而只是在集合中迭代。

For..each构造在集合或数组中的每个元素上迭代。结构形式如下:

for(Type varName : [Array || Collection]){
  //for each iteration varName is assigned an element in the collection/array
}
在您的示例中,外部循环是正确构造的,并且将为每个迭代将
ArrayList
分配给
priority
变量。内部循环构造不正确,因为您希望迭代
ArrayList
优先级中的每个元素,但是代码尝试使用
优先级
ArrayList中的元素。下面的代码显示了正确的结构,并用
列表
接口替换了
ArrayList
,该接口优于使用集合的具体类型

public static void renderSprites(List<List<AbstractSprite>> priorities){
    for (List<AbstractSprite> priority : priorities){
        for(AbstractSprite sprite : priority)){
           renderSprite(sprite);
        }
    }
}
publicstaticvoidrendersprites(列出优先级){
对于(列出优先级:优先级){
for(抽象精灵:优先){
renderSprite(精灵);
}
}
}

你大部分时间都在那里。你应该:

public static void renderSprites(List<List<AbstractSprite>> priorities){
    for (List<AbstractSprite> priority : priorities) { // You have priority here
        for (AbstractSprite sprite : priority) { // Now loop over priority to get sprite
           renderSprite(sprite);
         }
    }
}
publicstaticvoidrendersprites(列出优先级){
对于(列出优先级:优先级){//您在此处具有优先级
对于(AbstractSprite-sprite:priority){//Now循环优先级以获取sprite
renderSprite(精灵);
}
}
}

Check out:只想添加排序注释,先画的会被后画的画覆盖。所以,如果先绘制“最高”优先级,如果从最高到最低排序,“最低”优先级将被覆盖;这可能是你想要的,也可能不是你想要的。是的,我意识到了这一点,但我必须想出一个聪明的方法来增加新的优先级。也许通过使用我想要的它在前面/后面,我可以把较低的优先级转发一个并把新的优先级放在那个地方。谢谢,没有考虑列表而不是ARARYList。有什么你通常想用ArrayList来代替的吗?@SamWalls我总是使用
List
界面。我不知道有任何
ArrayList
公开的方法不在
List
接口中。这允许您在必要时更改实现,而无需更改代码。例如,假设您希望保留列表的顺序,并切换到
LinkedList
而不是
ArrayList
使用
list
接口的所有代码仍然可以正常工作,无需更改。