Как мне случайным образом выбирать элементы из массива, которые удовлетворяют условию?

#java

#java

Вопрос:

У меня есть класс player и group, который я использовал для создания экземпляра следующего:

 Player andrew = new Player(*name:* Andrew, *health:* 20)
Player samantha = new Player(*name:* Samantha, *health:* 32)
Player tony = new Player(*name:* Tony, *health:* 5)
Player flynn = new Player(*name:* Flynn, *health:* 0)
Player oliver = new Player(*name:* Oliver, *health:* 0)
Group myGroup = new Group(*player:* andrew, *player:* samantha, *player:* tony, *player:* flynn, *player:* oliver)
 

Следующий метод, который я определил в классе group, помещает всех игроков в группе в массив и возвращает его при вызове для объекта Group:

 myGroup.putIntoList()
 

Таким образом, приведение строки выше вернет:

 [Player@andrew, Player@samantha, Player@tony, Player@flynn, Player@oliver]
 

где каждый элемент массива — это объекты проигрывателя, которые я создал ранее.

Я также определил метод .getHealth() в моем классе player, который возвращает работоспособность проигрывателя.

Переходя к главному, я хочу написать метод в моем классе Group, который случайным образом выбирает игрока из этого сгенерированного массива, который также не мертв (т. Е. Здоровье выше 0) Это то, что я написал до сих пор:

 import java.util.Random;

Random myNumber = new Random();
public Player pickOutAndReturn(){
   int anotherNumber = myNumber.nextInt(5);
   return this.putIntoList()[anotherNumber];
}
 

Проблема в том, что он может возвращать любые 5 игроков случайным образом. Как мне изменить его так, чтобы он возвращал только живых участников, но случайным образом, не удаляя мертвых игроков из массива?

Комментарии:

1. Привет, вы также можете поддержать ответ i.stack.imgur.com/Y7YCv.png спасибо 🙂

Ответ №1:

Перед случайным выбором отфильтруйте массив с помощью:

 Players [] health_players = Arrays.stream(this.putIntoList())
                                  .filter(i -> i.getHealth() > 0)
                                  .toArray();
 

только тогда выбирай случайным образом из health_players .

 Random myNumber = new Random();
public Player pickOutAndReturn(){
     Players [] health_players = Arrays.stream(this.putIntoList())
                                       .filter(i -> i.getHealth() > 0)
                                       .toArray();

   int anotherNumber = myNumber.nextInt(health_players.length);
   return health_players[anotherNumber];
}
 

Ответ №2:

 public Player pickOutAndReturn() {
   // filter for alive players
   var alivePlayers = this.putIntoList().stream()
      .filter(player -> player.getHealth() > 0)
      .collect(Collectors.toList())
      
   // pick a random player from list
   int anotherNumber = myNumber.nextInt(alivePlayers.size());
   return alivePlayer.get(anotherNumber);