2014-02-14 1 views
0

На данный момент у меня есть этот код работает, но повторы:Абстрагируясь в ArrayList <E> итерации для создания повторно используемого метода

Iterator<Moo> it6 = moos.iterator(); 
    while (it6.hasNext()) { 
     Moo m = it6.next(); 
     m.update(); 
     if (!m.isActive()) 
     it6.remove(); 
} 

Iterator<Pip> it7 = pips.iterator(); 
    while (it7.hasNext()) { 
     Pip s = it7.next(); 
     s.update(); 
     if (!s.isActive()) 
     it7.remove(); 
} 

... and other ... 

Где пипсов и мычит определены на этом классе:

public class GameEngine { 
    private ArrayList<Moo> moos; 
    private ArrayList<Pip> pips; 
    ... 

И класс Moo/Pip like:

public class Moo extends GameSprite { 
    ... 

public class Pip extends GameSprite { 
    ... 

Могу ли я использовать какой-либо шаблон дизайна (или некоторые другие импланты) ementations), чтобы уменьшить количество написанных кодов и сделать его более элегантным?

+1

Являются '' isActive() 'и' update() 'объявленными в' GameSprite'? –

+0

Вам нужно добавить дополнительную информацию. Просто добавление объявления класса не очень помогает. Где определяется 'isActive()'. Где у вас есть этот код? И что именно делают эти коды, кроме удаления элемента из 'ArrayList'? –

+0

Что говорит @MarkPeters. Если да, и если вы готовы использовать внешнюю библиотеку, у Guava есть 'Iterables.removeIf()'. – fge

ответ

1

Если вы объявляете isActive() и update() в GameSprite, вы можете использовать общий метод:

private static void update(List<? extends GameSprite> sprites) { 

    Iterator<? extends GameSprite> it = sprites.iterator(); 
    while (it.hasNext()) { 
     GameSprite s = it.next(); 
     s.update(); 
     if (!s.isActive()) 
     it.remove(); 
    } 
} 

Тогда просто назвать его с

update(pips); 
update(moos); 
+0

Кажется, что каждый отправляет один и тот же ответ одновременно. +1, потому что вы были первыми. – Axel

+0

@ Если бы это было так, то по крайней мере вы могли бы поддержать другие ответы ради скромности! –

1

убедитесь класс GameSprite имеет IsActive() и обновление () в качестве методов (аннотация, если реализация не является одинаковой)

public void removeInactive(ArrayList<? extends GameSprite> itList){ 
     Iterator<GameSprite> it = itList.iterator(); 
     while (it.hasNext()) { 
      GameSprite s = it.next(); 
      s.update(); 
      if (!s.isActive()) 
       it.remove(); 
     } 
    } 
1

Вам нужен общий интерфейс, который предоставляет update() и isActive() methods. Either pull them up to the GameSprite class, or add another interface (e.g., Updatable`), которые реализуются всеми вашими классами.

После того, как вы сделали это, вы можете извлечь этот общий код для метода:

public updateAll (Iterable<? extends GameSprite> sprites) { 
    Iterator<? extends GameSprite> it = sprites.iterator(); 
    while (it.hasNext()) { 
     GameSprite s = it.next(); 
     s.update(); 
     if (!s.isActive()) 
     it.remove(); 
} 
0

Создайте интерфейс Updatable:

public interface Updatable { 
    void update(); 
    boolean isActive(); 
} 

и имеют Moo и Pip реализовать этот интерфейс. Затем ваш универсальный метод выглядит так:

public void update(List<? extends Updatable> items) { 
    Iterator<? extends Updatable> it6 = items.iterator(); 
    while (it6.hasNext()) { 
     Updatable m = it6.next(); 
     m.update(); 
     if (!m.isActive()) 
      it6.remove(); 
    } 
} 
Смежные вопросы