2015-05-15 5 views
0

Я делаю танк-игру. В моем классе PlayPanel я написал этот код, так как вы можете видеть, что он в основном такой же, но он используется для 3 разных ArrayList s.Как переписать эти 3 метода для повторного использования?

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

//obstacles 
for (int i = 0 ; i<obstacles.size() ; i++) { 
    if (obstacles.get(i).dood) 
     obstacles.remove(i); 
} 
//bullets 
for (int i = 0; i< bullets.size(); i++) { 
    bullets.get(i).redraw(); 
    //de positie van elke kogel wordt geupdate. 
    if(bullets.get(i).OutOfScreen()) { 
     bullets.remove(i);//uit scherm -> verwijdert en verplaatst 
    } 
} 

for (int i = 0; i< enemyBullets.size(); i++) { 
    enemyBullets.get(i).redraw(); 
    if(enemyBullets.get(i).OutOfScreen()) { 
     enemyBullets.remove(i); 
    } 
} 

Я думал о написании, но это не кажется правильным:

public void remove(ArrayList object) { 
    for (int i = 0; i< object.size(); i++) { 
     object.get(i).redraw(); 
     if(object.get(i).OutOfScreen()) { 
      object.remove(i); 
     } 
    } 
} 

Кроме того, я не знаю, как назвать этот способ, чтобы использовать его для одного из ArrayList с ,

+0

У вас есть 3 массива для разных целей, поэтому я думаю, что один из них должен позаботиться о себе индивидуально. не могли бы вы объяснить ** «Я действительно не знаю, как назвать этот метод, чтобы использовать его для одного из ArrayLists». ** лучше? ваш пост неясен, что вы спрашиваете –

+1

Три петли на самом деле не то же самое. Первый, по-видимому, использует логический флаг 'dood'. Остальные 2 выглядят одинаково, и ваш метод кажется правильным. Какую проблему вы получаете точно? – Hilikus

+0

@KickButtowski Я не знаю, как заставить java выполнить последний метод, который я написал для ArrayLists 'bombBullet' и' bullets', и где в моем коде мне нужно написать метод 'remove' – Sophia

ответ

-1

Ваш метод remove не будет работать, поскольку вы даете в качестве аргумента ArrayList из Object s. У них нет методов redraw и OutOfScreen. Что вы можете сделать, так это определить интерфейс, скажем GameObject, содержащий эти методы, и сделать Bullet реализовать его. Изменение подписи remove в

public void remove(ArrayList<? extends GameObject> object) { 
    //rest as before 
} 

Тогда вы можете позвонить, например remove(bullets) или remove(enemyBullets).

+0

Вы не можете добавлять или удалять элементы с использованием такого рода дженериков. –

+0

Ой, справа. Тем не менее, мы можем иметь 'public void remove (ArrayList object)', только тогда 'bullets' должен быть экземпляром' ArrayList 'вместо' AraryList '. –

2

Если вы используете Java 8, вы можете отфильтровать список, передав Predicate.

public class Helper { 
    //removePredicate can be any function that returns a boolean that will help 
    //to filter the data 
    static <T> void remove(List<T> list, Predicate<? super T> removePredicate) { 
     List<T> filteredList = list.stream() 
      .filter(removePredicate) 
      .collect(Collectors.toList()); 
     list.clear(); 
     list.addAll(filteredList); 
    } 
} 

Вот пример того, как использовать метод выше List<Bullet>:

//sample implementation for Bullet class 
class Bullet { 
    int value; 
    public Bullet(int value) { this.value = value; } 
    public boolean outOfScreen() { 
     return value > 10; 
    } 
    @Override public String toString() { 
     return String.format("Bullet: {%d}", value); 
    } 
} 

//somewhere you need to execute this code... 
//initialize your List 
List<Bullet> bulletList = new ArrayList<>(Arrays.asList(
    new Bullet(15), new Bullet(1), new Bullet(20), new Bullet(6))); 
//show the contents of the list 
System.out.println(bulletList); 
//remove the elements by using whatever you want/need 
//see how you can pass any way to filter the elements of the list 
Helper.remove(bulletList, b -> !b.outOfScreen()); 
//show the contents of the list again to show how it was filtered 
System.out.println(bulletList); 

Преимущество использования этого подхода является то, что вам не нужно наследование классов или что-то в этом роде.

0

Второй и третий петли могут быть объединены в один кусок кода, как показано ниже.

  1. У вас есть родительский класс (абстрактный или интерфейс), называемый ParentBullets.
  2. Bullets and EnemyBullets являются дочерними классами класса ParentBullets.

Теперь с помощью полиморфизма можно сделать следующие

public void loop(List<? extends ParentBullets> bullets){ 
for (int i = 0; i< bullets.size(); i++) { 
    bullets.get(i).redraw(); 
    //de positie van elke kogel wordt geupdate. 
    if(bullets.get(i).OutOfScreen()) { 
     bullets.remove(i);//uit scherm -> verwijdert en verplaatst 
    } 
} 
} 

Теперь вы можете иметь пули и enemybullets как коллекция является ArrayList, и вы можете вызвать выше метод, как:

петли (пуль); или петля (вражеские булыжники);