从“ for”循环中的列表中取出随机项目

时间:2018-10-05 21:36:31

标签: kotlin

我有一个包含另一个列表中随机元素的列表
var test = listOf<String>("Blah blah " + list1.shuffled().take(1)[0] + " blah blah")
较大的列表biglist,包含较小的列表,例如test
然后,有一个“ for”循环,其中我用biglist

中的随机列表填充stringbuilder
    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的创建放入for循环中(并在sb.append之后清除了它),但这只是使我的代码看起来更加糟糕(并且变慢了?)

也许对此有更好的解决方案? 谢谢

1 个答案:

答案 0 :(得分:1)

在循环内对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的元素
  • 您不需要list2list3的type参数,可以从列表的元素中推断出类型(String)
  • 如果您的列表很大,那么调用shuffle将会浪费资源,尤其是因为您只对该列表中的一个随机元素感兴趣。请改用以下扩展功能:fun List<*>.randomElement() = this[Random().nextInt(this.size)]