【问题标题】:Groovy way to check if a list is sorted or not检查列表是否已排序的 Groovy 方法
【发布时间】:2013-02-28 09:44:59
【问题描述】:

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

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

def possiblySorted = ["1", "2", "3"]
def sortedCopy = new ArrayList<>(possiblySorted)
sortedCopy.sort()

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

def possiblySorted = ["1", "2", "3"]
possiblySorted.isSorted()

有没有像这样的好方法来检查列表是否在 Groovy 中排序,或者哪种是首选方法?我几乎希望 Groovy 有这样的东西,因为它在集合和迭代方面非常聪明。

【问题讨论】:

    标签: list sorting groovy


    【解决方案1】:

    如果您想避免执行 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 很好的调用(尽管在 Java 7 中我相信 n*log(n) 是最坏的情况,因为 java 已转而使用名称出色的 timsort)。您还可以使用以下方法使您的代码快速失败:boolean isSorted(list) { list.size() &lt; 2 || !(1..&lt;list.size()).find { list[it - 1] &gt; list[it] } }
    • 或者这样使用every like 可能不那么迟钝:boolean isSorted(list) { list.size() &lt; 2 || (1..&lt;list.size()).every { list[it - 1] &lt;= list[it] } }
    • 不知道 Timsort,Tim =P;感谢您的链接! -- 关于第二条消息,是不是完全一样的解决方案(除了返回类型声明)?
    • 哈哈!是的....我以为你有each。我深表歉意(并且应该更清楚):-(
    • 没问题;我只需要用我的眼睛做一个字符一个字符的差异来确定=P
    【解决方案2】:

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

    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()
    

    【讨论】:

    • 只是为了确定:Groovy 语言中没有其他内置的速记用于此检查?
    • @MagnusTengdahl 不,我不知道 :-( 您可以将一个添加到列表(或集合)的元类中(我在答案中发布了上述方法)
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多