[英]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.