用于检查列表是否已排序的Groovy方法

Mag*_*lex 11 sorting groovy list

Groovy是否有一种智能方法来检查列表是否已排序?前提条件是Groovy实际上知道如何对对象进行排序,例如字符串列表.

我现在的方式(这个例子只有一些测试值)是将列表复制到一个新列表,然后对其进行排序并检查它们是否相等.就像是:

def possiblySorted = ["1", "2", "3"]
def sortedCopy = new ArrayList<>(possiblySorted)
sortedCopy.sort()
Run Code Online (Sandbox Code Playgroud)

我在几个地方的单元测试中使用它,所以它会很好用,例如:

def possiblySorted = ["1", "2", "3"]
possiblySorted.isSorted()
Run Code Online (Sandbox Code Playgroud)

有没有这样的好方法来检查列表是否在Groovy中排序,或者哪种方式是优先的?我几乎可以期待Groovy有这样的东西,因为它对集合和迭代非常聪明.

epi*_*ian 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])
Run Code Online (Sandbox Code Playgroud)

  • +1好的调用(尽管使用Java 7我相信`n*log(n)`是最糟糕的情况,因为java已经交换使用出色的名称[timsort](http://en.wikipedia.org/wiki/Timsort) ).您还可以使用以下命令快速使代码失败:`boolean isSorted(list){list.size()<2 || !(1 .. <list.size()).find {list [it - 1]> list [it]}}` (5认同)
  • 不知道Timsort,Tim = P; 谢谢你的链接! - 关于第二条消息,是不是完全相同的解决方案(除了返回类型声明)? (3认同)

tim*_*tes 8

为什么不将它与同一列表的排序实例进行比较?

def possiblySorted = [ 4, 2, 1 ]

// Should fail
assert possiblySorted == possiblySorted.sort( false )
Run Code Online (Sandbox Code Playgroud)

我们传递false给sort方法,因此它返回一个新列表而不是修改现有列表

您可以添加如下方法:

List.metaClass.isSorted = { -> delegate == delegate.sort( false ) }
Run Code Online (Sandbox Code Playgroud)

然后,你可以这样做:

assert  [ 1, 2, 3 ].isSorted()
assert ![ 1, 3, 2 ].isSorted()
Run Code Online (Sandbox Code Playgroud)