Java 如何在嵌套的ArrayList上执行for循环?
我将尽可能使这个2D渲染引擎模块化。我已经想出了一个绘制/更新精灵的优先级列表,但还没有完成,这样我就可以控制哪些精灵在彼此前面 此代码旨在循环遍历每个优先级列表并渲染该列表中的每个精灵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
//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
接口的所有代码仍然可以正常工作,无需更改。