11

Groovyには、リストがソートされているかどうかをチェックするスマートな方法がありますか?前提条件は、Groovyが実際にオブジェクト(文字列のリストなど)を並べ替える方法を知っていることです。

私が今行っている方法(この例ではいくつかのテスト値のみ)は、リストを新しいリストにコピーし、それを並べ替えて、それらが等しいことを確認することです。何かのようなもの:

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

私はこれをいくつかの場所での単体テストで使用しているので、次のようなものがあれば便利です。

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

リストがGroovyでソートされているかどうかを確認するためのこのような良い方法はありますか、それともどちらが好ましい方法ですか?コレクションと反復が非常に賢いので、Groovyにはこのようなものがあるとほぼ期待しています。

4

2 に答える 2

12

O(n * log(n))操作を実行してリストが並べ替えられているかどうかを確認したくない場合は、リストを1回だけ繰り返して、すべての項目が次の項目以下かどうかを確認できます。

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])
于 2013-02-28T10:54:37.530 に答える
8

同じリストのソートされたインスタンスと比較してみませんか?

def possiblySorted = [ 4, 2, 1 ]

// Should fail
assert possiblySorted == possiblySorted.sort( false )

sortメソッドに渡すfalseので、既存のリストを変更するのではなく、新しいリストを返します。

次のようなメソッドを追加できます。

List.metaClass.isSorted = { -> delegate == delegate.sort( false ) }

次に、次のことができます。

assert  [ 1, 2, 3 ].isSorted()
assert ![ 1, 3, 2 ].isSorted()
于 2013-02-28T09:47:36.627 に答える