Вы можете использовать sort
(или toSorted
) методы с пользовательским компаратором. Имейте в виду, что sort(Closure comparator)
изменяет список ввода, поэтому вы можете использовать:
sort(boolean mutate, Closure closure)
- или
toSorted(Closure closure)
метод, который создает новый список и сохраняет неизменным входной список.
Для компаратора вы получаете каждую строку версии, маркируете ее на символ .
и преобразуете каждый токен в целочисленное значение. Без этой части вы будете продолжать сравнивать строки. Позвольте мне показать вам это на примере:
def d = ["1.0.25.3306",
"0.7.25.3307",
"40.56.25.3308",
"8.78.25.3309",
"4.12.25.3310",
"6.23.25.3311",
"23.45.25.3312",
"12.89.25.3313",
"7.0.25.3314",
"20.5.25.3315",
"8.67.25.3316",
]
def result = d.toSorted { a, b ->
def (a1, a2, a3, a4) = a.tokenize(".")*.toInteger()
def (b1, b2, b3, b4) = b.tokenize(".")*.toInteger()
return a1 <=> b1 ?: a2 <=> b2 ?: a3 <=> b3 ?: a4 <=> b4
}
result.each { println it }
В закрытии компаратора мы берем каждую строку версии и маркируем ее по символу .
. Здесь мы фиксируем выходные данные метода tokenize()
в нескольких переменных, используя множественное присваивание, поэтому каждая часть получает свою собственную переменную. Затем мы используем оператор распространения *.
для вызова toInteger()
на каждом токене, который по умолчанию все еще является типом String
. После того, как мы представили две строки версии для этой формы, мы можем использовать оператор сравнения <=>
для сравнения каждой части версии. Мы используем оператор Элвиса ?:
для сравнения следующей части, если a
и b
в текущей части имеют одинаковое значение цифры c. Если вы запустите этот пример, вы получите что-то подобное в консоли вывода.
0.7.25.3307
1.0.25.3306
4.12.25.3310
6.23.25.3311
7.0.25.3314
8.67.25.3316
8.78.25.3309
12.89.25.3313
20.5.25.3315
23.45.25.3312
40.56.25.3308