2015-09-24 5 views
0

Я пытаюсь заменить некоторые символы в строке из картыДоступ к элементам карты при использовании переменного ключа в Groovy

Случай 1

​map= ['O':'0', 'L':'1', 'Z':'2', 'E':'3'] 
"Hey".toUpperCase().toCharArray().each{ 
     print map.get(it,it) 
    } 

В результате

HEY 

Случай 2: Я не использую toCharArray()

"Hey".toUpperCase().each{ 
     print map.get(it,it) 
    } 

Результат, как ожидается,

H3Y 

Так что я попробовал несколько вариантов при использовании toCharArray(), и единственный способ получить доступ к значению является использование map."$it"

Почему я могу использовать только map."$it" для получить доступ к моей карте при использовании toCharArray()?

+0

Не отвечающий на вопрос, но альтернативой является 'map = ['O': '0', 'L': '1', 'Z': '2', 'E': '3']. WithDefault { Это } ; println "Hey" .toUpperCase(). collect {map [it]} .join() ' –

ответ

4

Потому что вы пытаетесь получить значение из карты с помощью char в то время как каждый ключ есть String, и они не равна:

assert !'E'.equals('E' as char) 

$it работает, потому что он преобразуется в строку:

e = 'E' as char 

assert "$e".toString().equals('E') 

(Обратите внимание на toString() необходимо, в противном случае сравнение будет происходить между String и GStringImpl, которые не равен)

+0

и когда я использую' each' без 'toCharArray()' в ** случае 2 **, 'it' является строкой ? –

+0

Да. '$ groovy -e '" foo ".each {assert it in String}'' – Will