Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
ярлык для создания карты из списка в groovy?
Я бы хотел немного сортанд для этого:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
учитывая то, как обстоят дела с GDK, я бы ожидал, что смогу сделать что - то вроде:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
но я ничего не видел в документах... я что-то упустил? или я просто слишком ленив?
Недавно я столкнулся с необходимостью сделать именно это: преобразовать список в карту. Этот вопрос был опубликован до выхода Groovy версии 1.7.9, поэтому метод collectEntries еще не существовал. Он работает точно так же, как метод collectMap , который был предложен :
Map rowToMap(row) {
row.columns.collectEntries{[it.name, it.val]}
}
Если по какой-то причине вы застряли с более старой версией Groovy, то можно также использовать метод inject (как предложено здесь ). Это слегка измененная версия, которая принимает только одно выражение внутри закрытия (просто ради сохранения символов!):
Map rowToMap(row) {
row.columns.inject([:]) {map, col -> map << [(col.name): col.val]}
}
Оператор + также может использоваться вместо << .
Проверьте "inject". Настоящее функциональное программирование Вонки называют его "fold".
columns.inject([:]) { memo, entry ->
memo[entry.name] = entry.val
return memo
}
И, пока вы этим занимаетесь, вы, вероятно, хотите определить методы как категории, а не прямо на metaClass. Таким образом, вы можете определить его один раз для всех коллекций:
class PropertyMapCategory {
static Map mapProperty(Collection c, String keyParam, String valParam) {
return c.inject([:]) { memo, entry ->
memo[entry[keyParam]] = entry[valParam]
return memo
}
}
}
Пример использования:
use(PropertyMapCategory) {
println columns.mapProperty('name', 'val')
}
Кроме того, если вы используете Google collections (http://code.google.com/p/google-collections/ ), вы можете сделать что-то вроде этого:
map = Maps.uniqueIndex(list, Functions.identity());
ладно... Я играл с этим немного больше, и я думаю, что это довольно крутой метод...
def collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
ExpandoMetaClass.enableGlobally()
Collection.metaClass.collectMap = collectMap
Map.metaClass.collectMap = collectMap
теперь любой подкласс карты или коллекции имеет этот метод...
здесь я использую его для реверса ключа / значения в карте
[1:2, 3:4].collectMap{[it.value, it.key]} == [2:1, 4:3]
и здесь я использую его для создания карты из списка
[1,2].collectMap{[it,it]} == [1:1, 2:2]
теперь я просто помещаю это в класс, который вызывается при запуске моего приложения, и этот метод доступен во всем моем коде.
EDIT:
чтобы добавить метод ко всем массивам...
Object[].metaClass.collectMap = collectMap
Если вам нужна простая пара ключ-значение, то достаточно использовать метод collectEntries . Например
def names = ['Foo', 'Bar']
def firstAlphabetVsName = names.collectEntries {[it.charAt(0), it]} // [F:Foo, B:Bar]
Но если вам нужна структура, похожая на Multimap, в которой есть несколько значений для каждого ключа, то вы захотите использовать метод groupBy
def names = ['Foo', 'Bar', 'Fooey']
def firstAlphabetVsNames = names.groupBy { it.charAt(0) } // [F:[Foo, Fooey], B:[Bar]]
Я не могу найти ничего встроенного... но с помощью ExpandoMetaClass я могу сделать это:
ArrayList.metaClass.collectMap = {Closure callback->
def map = [:]
delegate.each {
def r = callback.call(it)
map[r[0]] = r[1]
}
return map
}
это добавляет метод collectMap ко всем ArrayLists... Я не знаю, почему добавление его в список или коллекцию не сработало.. Думаю, это уже другой вопрос... но теперь я могу это сделать...
assert ["foo":"oof", "42":"24", "bar":"rab"] ==
["foo", "42", "bar"].collectMap { return [it, it.reverse()] }
от списка до расчетной карты с одним закрытием... именно то, что я искал.
Edit: причина, по которой я не смог добавить метод в список интерфейсов и коллекцию, заключалась в том, что я этого не делал:
List.metaClass.enableGlobally()
после этого вызова метода можно добавить методы в интерфейсы.. что в данном случае означает, что мой метод collectMap будет работать на диапазонах, подобных этому:
(0..2).collectMap{[it, it*2]}
что дает карту: [0:0, 1:2, 2:4]