簡體   English   中英

用於檢查列表是否已排序的Groovy方法

[英]Groovy way to check if a list is sorted or not

Groovy是否有一種智能方法來檢查列表是否已排序? 前提條件是Groovy實際上知道如何對對象進行排序,例如字符串列表。

我現在的方式(這個例子只有一些測試值)是將列表復制到一個新列表,然后對其進行排序並檢查它們是否相等。 就像是:

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

我在幾個地方的單元測試中使用它,所以它會很好用,例如:

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

有沒有這樣的好方法來檢查列表是否在Groovy中排序,或者哪種方式是優先的? 我幾乎可以期待Groovy有這樣的東西,因為它對集合和迭代非常聰明。

如果您想避免執行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])

為什么不將它與同一列表的排序實例進行比較?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM