Groovy сортировка в формате String docker теги в числовом порядке - PullRequest
1 голос
/ 28 апреля 2020

У меня есть массив docker значений тегов изображения в строковом формате. Я должен был отсортировать значения в числовом формате и отобразить в порядке убывания.

Как изменить приведенный ниже код для сортировки в числовом порядке?

class Sorting {
    def static main(args) {   
        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",
                ]

        println d.sort()
    }
}

1 Ответ

1 голос
/ 28 апреля 2020

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...