Подтвердить что ты не робот

Получить случайный элемент из списка с использованием потоков kotlin

Как получить случайный элемент из списка простым и сжатым способом.
ex: если я хочу получить четное случайное число из этого списка.

val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }

Заметка:
Я знаю, что в java есть некоторые аналогичные ответы, которые решают эту проблему, но я думаю, что у нас может быть более краткий путь в котлин.

4b9b3361

Ответ 1

Начиная с Kotlin 1.2 у нас есть Iterable.shuffled(). Этот метод может помочь вам с использованием List.take() для извлечения нужного количества элементов (только один в этом примере).

val list = (1..9).filter { it % 2 == 0 }
return list.shuffled().take(1)[0]

Этот метод менее оптимизирован, чем Humazed, но работает в многоплатформенном контексте и является более гибким.


EDIT:

Объект Random планируется для стандартной библиотеки Kotlin 1.3-M1, более подробную информацию об этом можно найти здесь: https://github.com/Kotlin/KEEP/blob/random/proposals/stdlib/random.md


ОБНОВЛЕНИЕ 2:

Мультиплатформенный генератор случайных чисел теперь доступен в превью Kotlin 1.3-M1. Больше информации об этом здесь: https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/


ОБНОВЛЕНИЕ 3:

Kotlin 1.3 теперь доступен с мультиплатформенным генератором случайных чисел! Вы можете использовать это так:

import kotlin.random.Random

fun main() {
    println(Random.nextBoolean())
    println(Random.nextInt())
}

Попробуйте онлайн!

или в вашем случае

fun main() {
    val list = (1..9).filter { it % 2 == 0 }
    println(list.random())
}

Попробуйте онлайн!

Ответ 2

Я думаю, что самый простой и самый сжатый способ - создать функцию расширения, которая возвращает случайный элемент, чтобы его можно было использовать следующим образом:

val random = list.random()

функция расширения:

/**
 * Returns a random element.
 */
fun <E> List<E>.random(): E? = if (size > 0) get(Random().nextInt(size)) else null

благодаря комментарию @Francesco здесь есть еще одна функция, которая принимает случайный экземпляр как источник случайности

/**
 * Returns a random element using the specified [random] instance as the source of randomness.
 */
fun <E> List<E>.random(random: java.util.Random): E? = if (size > 0) get(random.nextInt(size)) else null

Ответ 3

Перетасовывать весь список, чтобы получить только одно случайное число, - пустая трата производительности.

Вместо этого используйте random(), который был представлен в Kotin 1.3

val randomNumber = listOf(1, 6, 8).random()

Для вашего особого варианта использования имеет смысл сначала отфильтровать список и выбрать случайное число из оставшихся элементов.

val randomEvenNumber = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }.random()

Ответ 4

Ну, я попробовал много способов, не сработало, но я начинаю делать это для rundom() и выбираю 25 элементов из моего списка.

    var suliTraffic = ArrayList<SuliTraffic>()
    var randomsuliTraffic = ArrayList<SuliTraffic>()
// I have add some data to my Array List
    randomsuliTraffic.add(new)

// Here i shuffle all the information i have wich is over 400 object
    randomsuliTraffic.shuffle()

// now you can just simply get 25 item from this randomsuliTraffic like this
     for (i in randomsuliTraffic.take(25)){
            suliTraffic.add(i)
     } 

Теперь вы можете найти 25 случайных объектов в моем списке suliTraffic