1

Тема: Хитромудра вибірка

Прів.
Є отаке

class Room
{
 class Wall
{
  public boolean state;
}

public Wall left, right, top, bottom;
}

Room[][] rooms = new Room[10][10];

Мені тре взяти рандомну стіну, в котрої state==true.

Як то мона швидко і гарно зробити?

2

Re: Хитромудра вибірка

Взяти рандомну кімнату, в неї взяти рандомну стіну. Якщо state==false, починаємо спочатку.

Єдина проблема: що, як стін з потрібним state взагалі нема, або дуже мало?

3

Re: Хитромудра вибірка

Варіант2: попередньо знаходимо положення всіх стін, у яких state==true, після чого рандомно вибираємо одне з них.

Подякували: Master_Sergius, FakiNyan2

4

Re: Хитромудра вибірка

Не тестував, перевір:

Arrays.stream(rooms) // -> стрім масивів 2 порядку
      .flatMap(Arrays::stream) // -> стрім кімнат
      .flatMap(room -> Stream.of(room.left, room.right, room.bottom, room.top)) // -> стрім стін
      .filter(wall -> wall.state == true)
      .sorted((w1, w2) -> ThreadLocalRandom.current().nextBoolean() ? 1 : -1)
      .findFirst().get();
Подякували: FakiNyan1

5

Re: Хитромудра вибірка

iovchynnikov написав:

Не тестував, перевір:

Arrays.stream(rooms) // -> стрім масивів 2 порядку
      .flatMap(Arrays::stream) // -> стрім кімнат
      .flatMap(room -> Stream.of(room.left, room.right, room.bottom, room.top)) // -> стрім стін
      .filter(wall -> wall.state == true)
      .sorted((w1, w2) -> ThreadLocalRandom.current().nextBoolean() ? 1 : -1)
      .findFirst().get();

А це точно швидко? Яка тут складність?

6

Re: Хитромудра вибірка

quez написав:
iovchynnikov написав:

Не тестував, перевір:

Arrays.stream(rooms) // -> стрім масивів 2 порядку
      .flatMap(Arrays::stream) // -> стрім кімнат
      .flatMap(room -> Stream.of(room.left, room.right, room.bottom, room.top)) // -> стрім стін
      .filter(wall -> wall.state == true)
      .sorted((w1, w2) -> ThreadLocalRandom.current().nextBoolean() ? 1 : -1)
      .findFirst().get();

А це точно швидко? Яка тут складність?

Імплементація стрімів трохи хитромудра, вона може комбінувати операції. Так от фільтр і флетмап радше за все будуть спомбіновані до 1 прохіду, тож згадувати яка складність тут не буду, не знаю :)
Швидко як for/while точно не буде, але я й не думаю що там гігабайти стін і кімнат.

7

Re: Хитромудра вибірка

а я не можу той stream юзати, бо пишу не просто на жабі, а в середовищі, що використовує якусь древню жабу.
Коротше, я зробив так, як казав пан Пі.Вай.
Додав всі стіни в список, а потім беру рандомну стіну зі списка.