2013-12-23 4 views
4

Я собираюсь сделать этот движок 2D-рендеринга настолько модульным, насколько возможно. Я придумал, но еще не закончен, список приоритетов для рисования/обновления спрайтов, чтобы я мог контролировать, какие спрайты находятся перед собой.Как сделать цикл for над вложенным ArrayList?

Этот код предназначен для перебора каждого списка приоритетов и визуализации каждого спрайта в этом списке.

//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? 
     } 
    } 
} 
+1

Избавьтесь от 'get'. –

+0

Отъезд: http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html –

ответ

1

Конструкция for..each выполняет итерацию по каждому элементу в коллекции или массиве. Конструкция находится в форме:

for(Type varName : [Array || Collection]){ 
    //for each iteration varName is assigned an element in the collection/array 
} 

В нашем примере внешний контур правильно построен и назначит ArrayList к priority переменной для каждой итерации. Внутренний цикл не построен должным образом, так как вы хотите перебирать каждый элемент в приоритете ArrayList, однако код пытается использовать элемент из priorityArrayList. Следующий код показывает правильную структуру и заменяет ArrayList интерфейсом List, который предпочтительнее использования конкретного типа коллекции.

public static void renderSprites(List<List<AbstractSprite>> priorities){ 
    for (List<AbstractSprite> priority : priorities){ 
     for(AbstractSprite sprite : priority)){ 
      renderSprite(sprite); 
     } 
    } 
} 
+0

Спасибо, не рассматривал List вместо ArrayList. Есть ли что-то, что вы обычно хотели бы использовать вместо ArrayList? –

+0

@SamWalls Я всегда использую интерфейс 'List'. Я не знаю никаких методов, которые 'ArrayList' публично раскрывает, которые не входят в интерфейс' List'. Это позволяет вам изменить свою реализацию при необходимости без изменений кода. Например, скажем, вы хотели сохранить порядок списка и переключиться на «LinkedList», а не на «ArrayList», весь код, который использует интерфейс «List», по-прежнему будет работать без изменений. –

4

Если просто

for (ArrayList<AbstractSprite> priority : priorities){ 
    for(AbstractSprite sprite : priority){ 
     renderSprite(sprite); 
    } 
} 

Это предполагает, что приоритеты ArrayList сортируются в порядке от высокой к низкой приоритетности, так что вы рендеринга спрайтов с наивысшим приоритетом.

Помните, что метод get()ArrayList ожидает int, который представляет индекс элемента, к которому вы хотите получить доступ. Для каждой петли реализованы, чтобы сделать индексирование непрозрачным для пользователя и просто перебирать через коллекцию.

+0

Просто хотел добавить комментарий для сортировки, нарисованные сначала будут нарисованы теми, которые были нарисованы позже. Поэтому «наивысший» приоритет, если он сделан первым, будет перезаписан «самым низким» приоритетом, если он отсортирован с самого высокого на самый низкий; который может или не может быть тем, что вы хотите. – DoubleDouble

+0

Да, я понял это, но мне нужно будет найти разумный способ добавления новых приоритетов. Может быть, используя то, что я хочу, чтобы быть впереди/позади, я могу просто сдвинуть более низкие приоритеты вперед и поставить новый приоритет в этом месте. –

1

Вы в основном там. Вы должны иметь:

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); 
     } 
    } 
} 
Смежные вопросы