我有一个包含另一个列表中随机元素的列表
var test = listOf<String>("Blah blah " + list1.shuffled().take(1)[0] + " blah blah")
较大的列表biglist
,包含较小的列表,例如test
然后,有一个“ for”循环,其中我用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
的创建放入for
循环中(并在sb.append之后清除了它),但这只是使我的代码看起来更加糟糕(并且变慢了?)>
也许对此有更好的解决方案? 谢谢
答案 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
的元素list2
和list3
的type参数,可以从列表的元素中推断出类型(String)shuffle
将会浪费资源,尤其是因为您只对该列表中的一个随机元素感兴趣。请改用以下扩展功能:fun List<*>.randomElement() = this[Random().nextInt(this.size)]