Groovy是否有智能方法来检查列表是否已排序?前提条件是Groovy实际上知道如何对对象进行排序,例如字符串列表。
我现在的方式(本例中只有一些测试值)是将列表复制到新列表,然后对其进行排序并检查它们是否相等。类似的东西:
def possiblySorted = ["1", "2", "3"]
def sortedCopy = new ArrayList<>(possiblySorted)
sortedCopy.sort()
我在几个地方的单元测试中使用它,所以它会很好用,例如:
def possiblySorted = ["1", "2", "3"]
possiblySorted.isSorted()
有没有这样的好方法来检查列表是否在Groovy中排序,或者哪种方式是优先的?我几乎希望Groovy能够拥有这样的东西,因为它在收集和迭代方面非常聪明。
答案 0 :(得分:12)
如果您想避免执行O(n * log(n))操作以检查列表是否已排序,您只需迭代一次并检查每个项目是否小于或等于下一个项目:
def isSorted(list) {
list.size() < 2 || (1..<list.size()).every { list[it - 1] <= list[it] }
}
assert isSorted([])
assert isSorted([1])
assert isSorted([1, 2, 2, 3])
assert !isSorted([1, 2, 3, 2])
答案 1 :(得分:7)
为什么不将它与同一列表的排序实例进行比较?
def possiblySorted = [ 4, 2, 1 ]
// Should fail
assert possiblySorted == possiblySorted.sort( false )
我们将false
传递给sort方法,因此它返回一个新列表而不是修改现有列表
您可以添加如下方法:
List.metaClass.isSorted = { -> delegate == delegate.sort( false ) }
然后,你可以这样做:
assert [ 1, 2, 3 ].isSorted()
assert ![ 1, 3, 2 ].isSorted()