我试图从int列表中选择一个随机元素,并使用范围运算符创建列表元素:
def date_range = 1..28
assert ('a'..'d').collect() == ['a','b','c','d'] // So this is instanceof List
assert ('a'..'d') == ['a','b','c','d'] // So this is instanceof List
def x1 = (1..28).collect().sort{new Random()}?.take(1)[0] // works
def x2 = date_range.collect().sort{new Random()}?.take(1)[0] // works
def x3 = date_range[0..27].sort{new Random()}?.take(1)[0] //works
def x4 = date_range.sort{new Random()}?.take(1)[0] // does not works
x4低于例外
Caught: java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException
at listManipulation.run(listManipulation.groovy:21)
x4上的错误是什么?
更新
我的困惑是:如果我将date_range定义为def date_range = 1..28
并检查如下:assert date_range instanceof List
,而不是它通过。为什么我要再次将其转换为列表?
答案 0 :(得分:0)
date_range
的类型为IntRange
。不确定为什么在sort
上不支持Range
。但是toSorted
被用来实现同样的目标。
您应该可以使用以下方式调用它:
def date_range = 1..28
def x4 = date_range.toSorted {new Random()}?.take(1)[0]
println x4
此外,在array
之前将范围转换为list
或sort
(这是x3
的情况),如下所示:
println date_range.toList().sort {new Random()}?.take(1)[0]
println date_range.toArray().sort {new Random()}?.take(1)[0]
编辑:根据OP的评论。
date_range
是不可变列表。
在你的所有x1,x2,x3中,你只创建一个集合/列表(在不可变列表上),它变得可变,然后能够sort
。同样如上。
sort
上不允许 immutable list
。
以下作品。
def mutableList = ['Groovy', 'Java', 'JRuby']
mutableList.sort()
但是,一旦列表不可变,那么它现在允许和结果UnsupportedOperation
例外。
def immutableList = ['Groovy', 'Java', 'JRuby'].asImmutable()
immutableList.sort()
希望现在很清楚。