Ссылаясь на этот вопрос: Как вычесть даты друг из друга а>
В Groovy у меня есть скрипт, который выдает 5 самых больших значений из набора текстовых файлов. Как я могу узнать, каковы индексы этих значений?
Ссылаясь на этот вопрос: Как вычесть даты друг из друга а>
В Groovy у меня есть скрипт, который выдает 5 самых больших значений из набора текстовых файлов. Как я могу узнать, каковы индексы этих значений?
Если у вас есть список вещей, например:
def list = [ 'c', 'a', 'b' ]
Один из способов узнать исходный индекс — использовать transpose()
для присоединения этого списка к счетчику, затем отсортировать новый список, после чего у вас будет отсортированный список с исходным индексом в качестве вторичного элемента.
ie:
[list,0..<list.size()].transpose().sort { it[0] }.each { item, index ->
println "$item (was at position $index)"
}
Чтобы сломать это;
[list,0..<list.size()]
дает нам (фактически) новый список [ [ 'c', 'a', 'b' ], [ 0, 1, 2 ] ]
вызов transpose()
дает нам: [ [ 'c', 0 ], [ 'a', 1 ], [ 'b', 2 ] ]
Затем мы сортируем список на основе первого элемента в каждом элементе (буквы из нашего исходного списка) с помощью sort { it[0] }
И затем перебираем каждый, распечатывая наш теперь отсортированный элемент и его исходное положение индекса.
collect
со счетчиком тоже может творить чудеса: def i = 0; list.collect { [it, i++] }
и, возможно, его проще понять. inject
также может это сделать и не требует дополнительного оператора, но я думаю, что это не так красиво. Жаль, что collect
не принимает замыкание с элементом и индексом (пока) или что нет Python-подобного enumerate
.
- person epidemian; 11.11.2011
enumerate
к List
, чтобы получить список пар (индекс, значение), таких как эквивалент Python. Ваше здоровье.
- person epidemian; 11.11.2011
Если значения уникальны, вы можете просто использовать метод indexof
для исходного списка. Например, если у вас есть список:
def list = [4, 8, 0, 2, 9, 5, 7, 3, 6, 1]
И вы знаете, как получить 5 самых больших значений:
def maxVals = list.sort(false, {-it}).take 5 // This list will be [9, 8, 7, 6, 5]
Затем вы можете сделать:
def indexes = maxVals.collect { list.indexOf it }
println indexes
И он напечатает:
[4, 1, 6, 8, 5]
def maxVals...
- person blaughli; 15.11.2011
sort(boolean mutate, Closure closure)
. Передача false
в качестве первого параметра предотвращает изменение исходного списка методом сортировки; вместо этого он возвращает новый отсортированный список. Второй параметр — это замыкание, которое возвращает значение для сравнения в методе сортировки. В этом случае передача замыкания {-it}
отсортирует список в порядке убывания. Вся строка эквивалентна def maxVals = list.clone().sort().reverse().take(5)
- person epidemian; 15.11.2011
def maxVals = list.sort(false).reverse().take(5)
.
- person epidemian; 15.11.2011