Как получить доступ к хэш-картам в grails

#grails #groovy #hashmap

#grails #groovy #хэш-карта

Вопрос:

У меня интересная проблема: я не могу получить доступ к своим ключам хэш-карты.

У меня есть следующая хэш-карта:

 {a=Retrieve User Account call failed, b=This user has multiple accounts}
  

Я получаю пустые переменные, когда выполняю любое из следующих действий:

 "${myMap.get('a')}"
"${myMap['a']}"
"${myMap.a}"
  

Я получаю ложные значения из:

 "${myMap.containsKey('a')}"
"${myMap.keySet().contains('a')}"
  

Но я получаю true, когда делаю:

 "${myMap.keySet()[1] == 'a'}"
  

В чем проблема? И как я могу вызвать contains либо ключи hashmap, либо набор ключей, чтобы узнать, есть ли ‘a’ в хэше / списке?

Если это поможет, я использую плагин groovy 2.3.0-rc-2 для набора инструментов Groovy / Grails и grails 2.4.1

Комментарии:

1. Это недопустимая хэш-карта, которая выглядит как какой-то действительно сломанный JSON.

2. То, что вы описываете, на самом деле невозможно, но, учитывая то, как вы представляете карту в своем примере, трудно сказать, является ли это вообще картой. Кроме того, если у вас есть карта, в которой есть ключ «a», и значение, связанное с этим ключом, является строкой «Ошибка вызова учетной записи пользователя», тогда myMap.get('a') , myMap['a'] и myMap.a все они будут преобразованы в строку «Ошибка вызова учетной записи пользователя».

3. @JoshuaMoore это не сломанный JSON, это стандарт toString() карты Java.

4. @IanRoberts Ах да! Действительно, это так!

5. Что такое a и b здесь? Они определенно являются строками, а не (скажем) GStrings? Как именно инициализируется карта?

Ответ №1:

Возможно, это дублирующий вопрос, но я все равно на него отвечу. Ваш синтаксис в Groovy немного отличается.

Смотрите здесь:http://groovy.codehaus.org/Collections

Их примеры:

 def map = [name:"Gromit", likes:"cheese", id:1234]
assert map.get("name") == "Gromit"
assert map.get("id") == 1234
assert map["name"] == "Gromit"
assert map['id'] == 1234
assert map instanceof java.util.Map

def emptyMap = [:]
assert emptyMap.size() == 0
emptyMap.put("foo", 5)
assert emptyMap.size() == 1
assert emptyMap.get("foo") == 5
  

Ваша карта:

 def map = [a:"Retrieve User Account call failed", 
    b:"This user has multiple accounts"]

assert map.get("a") == "Retrieve User Account call failed"
// also
assert map.a == "Retrieve User Account call failed"
  

Комментарии:

1. Утверждения, которые у вас есть там с одиночными значениями, недействительны. Вам нужно двойное равенство.