Возьмите случайный элемент из списка в цикле "for" - PullRequest
0 голосов
/ 06 октября 2018

У меня есть список, содержащий случайный элемент из другого списка
var test = listOf<String>("Blah blah " + list1.shuffled().take(1)[0] + " blah blah")
Больший список biglist, содержащий меньшие списки, такие как test
Затем есть цикл «для», в котором я заполняю stringbuilder случайными списками из biglist

    var list3 = listOf<String>("Something something1","Something something2")
    var list2 = listOf<String>("item1", "item2", "item3", "item4")
    var list = listOf<String>("Blah " + list2.shuffled().take(1)[0] + " blah")
    var sb = StringBuilder ()
    var biglist = listOf<String>()
    if (...) biglist += list
    if (...) biglist += list3.get(0)
    if (...) biglist += list3.get(1)
    for (i in 0 until 4) {
        sb.append(biglist.shuffled().take(1)[0] + "\n")
        i + 1
    }

    println(sb)

Итак, на выходе я хочу увидеть что-то вроде этого:

Something something1
Blah item2 blah
Something something2
Blah item4 blah

Вместо этого у меня есть это:

Something something1
Blah item2 blah
Something something2
Blah item2 blah

Моя проблема в том, что в списке sb, test будет каждый раз содержать один и тот же элемент, случайно выбранный в начале кода из list1
У меня есть видрешил это, поместив создание biglist INTO в цикл for (и очистив его после sb.append), но это просто заставило мой код выглядеть еще более забавным (и медленнее?)

Может быть, естьлучшее решение для этого?Спасибо

1 Ответ

0 голосов
/ 06 октября 2018

Сделайте оценку list внутри цикла:

var list3 = listOf("Something something1", "Something something2")
var list2 = listOf("item1", "item2", "item3", "item4")

var sb = StringBuilder()

(0..4).forEach {
    var list = listOf("Blah ${list2.shuffled().first()} blah")

    var biglist = listOf<String>()
    biglist += list // left out the if statements for simplicity
    biglist += list3.get(0)
    biglist += list3.get(1)
    sb.append(biglist.shuffled().first() + "\n")
}

println(sb)

Несколько замечаний:

  • используйте диапазон и forEach, чтобы сделать это несколько раз (так каквам не нужна переменная цикла i в любом случае
  • take(1)[0] можно заменить на first()
  • использовать шаблон строки для создания элемента list
  • вам не нужен параметр типа для list2 и list3, тип (String) может быть выведен из элементов списка
  • , если ваш список становится большим, вызов shuffle будет пустой тратойресурсов, особенно потому, что вас интересует только один случайный элемент из этого списка. Вместо этого используйте эту функцию расширения: fun List<*>.randomElement() = this[Random().nextInt(this.size)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...