Groovy способ проверки сортировки списка или нет.

Имеет ли Groovy умный способ проверить, отсортирован ли список? Предпосылкой является то, что Groovy действительно знает, как сортировать объекты, например. список строк.

То, как я это делаю сейчас (только с некоторыми тестовыми значениями для этого примера), это скопировать список в новый список, затем отсортировать его и проверить, что они равны. Что-то вроде:

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

Я использую это в модульных тестах в нескольких местах, поэтому было бы хорошо с чем-то вроде:

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

Есть ли хороший способ, чтобы проверить, отсортирован ли список в Groovy, или который является предпочтительным способом? Я бы почти ожидал, что Groovy будет иметь что-то вроде этого, так как он настолько умный с коллекциями и итерацией.

Ответ 1

Почему бы просто не сравнить его с отсортированным экземпляром одного и того же списка?

def possiblySorted = [ 4, 2, 1 ]

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

Мы передаем false методу сортировки, поэтому он возвращает новый список, а не модифицирует существующий

Вы можете добавить такой метод:

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

Затем вы можете сделать:

assert  [ 1, 2, 3 ].isSorted()
assert ![ 1, 3, 2 ].isSorted()

Ответ 2

Если вы хотите избежать операции 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])