Динамически создавать пару ключ:значение

У меня есть следующий groovy-скрипт:

#!/usr/bin/env groovy 
def files = [ 
    'file-1.bat' :  
        [       
            'content-1-1', 
            'content-1-2', 
            'content-1-3' 
        ],      
    'file-1' : 
        [       
            'content-unix-1-1', 
            'content-unix-1-2', 
            'content-unix-1-3', 
        ],      

    'file-2.bat' :  
        [       
            'content-2-1', 
            'content-2-2', 
            'content-2-3' 
        ],      
    'file-2' : 
        [       
            'content-unix-2-1', 
            'content-unix-2-2', 
            'content-unix-2-3', 
        ],      
] 

files.each { 
    file_key, file_value -> println file_key; 
    file_value.each { 
        file_content -> println "\t"+file_content; 
        files[ file_key ] = [file_content : true]; 
    }   
} 

println ' Upgraded content'; 

files.each { 
    file_key, file_value -> println file_key; 
    file_value.each { 
        file_content -> println "\t"+file_content; 
    }   
} 

Следующие строки вызывают мои проблемы:

files[ file_key ] = [file_content : true]; 

Что я хочу сделать, так это создать для каждой записи на карте также истинную часть пары ключ: значение... Я знаю, что я не определял список таким образом... Я пытался улучшить map с помощью files[file_key].put(key, value); но это не работает... Может быть, я думаю в совершенно неправильном направлении... Предыстория этой конструкции в том, что в файлах (файл-1.bat, файл-1 и т. д.) я проверю наличие содержимое, указанное как карта

'file-1.bat' : [       
     'content-1-1', 
     'content-1-2', 
     'content-1-3' 
 ],

Я мог бы сделать следующее:

'file-1.bat' : [       
     'content-1-1' : false, 
     'content-1-2' : false, 
     'content-1-3' : false, 
 ],

но это именно то, чего я хочу избежать.


person khmarbaise    schedule 27.12.2011    source источник


Ответы (1)


Вы правы, думая, что put() решит вашу проблему, но вы не можете поместить элемент карты в список. Вам нужно сначала создать карту, в которую можно put вставить, а затем назначить полученную карту в качестве вывода.

Например:

files.each { 
    file_key, file_value -> println file_key; 
    def file_map = [:]; 
    file_value.each { 
        file_content -> println "\t"+file_content; 
        file_map.put(file_content, true); 
    }
    files[ file_key ] = file_map; 
} 
person philofinfinitejest    schedule 27.12.2011
comment
Использовал http://groovyconsole.appspot.com/, чтобы убедиться в этом; очень кстати. - person philofinfinitejest; 27.12.2011