2013-09-02 3 views
0

У меня есть картаСоздать карту из существующей карты в Groovy

[email:[[email protected], [email protected]], jobTitle:[SE, SD], isLaptopRequired:[on, on], phone:[9908899876, 7765666543], name:[hus, Vin]] 

, для которого я должен иметь другую карту, как

[hus:[[email protected],SE,99087665343],vin:[[email protected],SE,7765666543]] 

Как это сделать в Groovy?

+0

Я предполагаю, что ваш «образ вывода» неправильный? Вы действительно хотите иметь SE в обеих результирующих ценностях? Кроме того, где данные isLaptop в результате? Называется ли название «Vin» на начальной карте, или вы получаете ключи от своей карты с адресов электронной почты? – billjamesdev

ответ

1

Вы могли бы сделать это нравится:

def map = [email:['[email protected]', '[email protected]'], jobTitle:['SE', 'SD'], isLaptopRequired:['on', 'on'], phone:['9908899876', '7765666543'], name:['hus', 'Vin']] 

def result = [:] 

map.name.eachWithIndex { name, idx -> 
    result << [ (name): map.values()*.getAt(idx) - name ] 
} 

assert result == [hus:['[email protected]', 'SE', 'on', '9908899876'], Vin:['[email protected]', 'SD', 'on', '7765666543']] 

Или вы могли бы также сделать:

def result = [map.name,map.findAll { it.key != 'name' }.values().toList().transpose()].transpose().collectEntries() 

Но это как раз меньше кода за счет как читаемость и ресурсов использования ;-)

+0

Тим, у Groovy есть известный порядок ключей или Карта? Если нет, как вы определяете, в каком порядке будут возвращаться значения? – billjamesdev

+1

@BillJames По умолчанию Groovy использует 'LinkedHashMap' для карт, поэтому порядок поддерживается –

0

наиболее визуальное решение я есть:

def map = [email:['[email protected]', '[email protected]'], jobTitle:['SE', 'SD'], isLaptopRequired:['on', 'on'], phone:['9908899876', '7765666543'], name:['hus', 'Vin']] 


    def names = map.name 
    def emails = map.email 
    def jobTitles = map.jobTitle 
    def isLaptopRequireds = map.isLaptopRequired //sorry for the variable name 
    def phones = map.phone 

    def result = [:] 
    for(i in 0..names.size()-1) { 
     result << [(names[i]): [emails[i], jobTitles[i], isLaptopRequireds[i], phones[i]]] 
    } 
    assert result == [hus:['[email protected]', 'SE', 'on', '9908899876'], Vin:['[email protected]', 'SD', 'on', '7765666543']] 
} 
Смежные вопросы