Карта внутри карты в Скала - PullRequest
3 голосов
/ 09 августа 2011

У меня есть этот код:

val total = ListMap[String,HashMap[Int,_]]
val hm1 = new HashMap[Int,String]
val hm2 = new HashMap[Int,Int]
...
//insert values in hm1 and in hm2
...
total += "key1" -> hm1
total += "key2" -> hm2

....

val get = HashMap[Int,String] = total.get("key1") match {
  case a : HashMap[Int,String] => a
}

Эта работа, но я бы знал, существует ли лучший (более читаемый) способ сделать это. Спасибо всем!

Ответы [ 4 ]

4 голосов
/ 09 августа 2011

Похоже, вы пытаетесь повторно реализовать кортежи как карты.

val total : ( Map[Int,String], Map[Int,Int]) = ...

def get : Map[Int,String] = total._1
0 голосов
/ 09 августа 2011

Прежде всего: это не ответ (поскольку я не рекомендовал бы подход, который я обсуждаю), но это было слишком долго для комментария.

Если у вас не слишком много разных ключей в вашей ListMap, я бы посоветовал попробовать ответ Мальволио. В противном случае из-за стирания типов другие подходы, основанные на сопоставлении с образцом, практически эквивалентны этому (что работает, но очень небезопасно):

val get = total("key1").asInstanceOf[HashMap[Int, String]]

Причины, по которым это небезопасно (если вы не любите опасную жизнь):

  1. total ("key1") не возвращает Option (в отличие от total.get ("key1")). Если «key1» не существует, он выдаст исключение NoSuchElementException. В любом случае, я не был уверен, как вы планируете управлять делом «Ни одного».
  2. asInstanceOf также с радостью приведёт итоговое значение («key2») - которое должно быть HashMap [Int, Int], но в данный момент является HashMap [Int, Any] - в HashMap [Int, String]. У вас будут проблемы позже, когда вы попытаетесь получить доступ к значению Int (которое теперь Scala считает String)
0 голосов
/ 09 августа 2011

Ваша карта total, содержащая карты с неодинаковыми типами значений, лучше избегать.Вопрос в том, что когда вы извлекаете карту в "key1", а затем приводите ее к карте строк, почему вы выбрали String?

Самой тривиальной причиной может быть то, что key1 и т. Д. Являются просто константами, что вы знаете их все, когда пишете свой код.В этом случае у вас, вероятно, должно быть val для каждой из ваших карт, и полностью отказаться от карты карт.

Возможно, что звонки, сделанные клиентским кодом, обладают этими знаниями.Скажем, что клиент выполняет stringMap ("key1") или intMap ("key2") или что так или иначе, вызов подразумевает, что ожидается некоторый данный тип.Это клиент несет ответственность за не смешивание типов и имен.Опять же, в этом случае нет оснований для общего.У вас была бы карта строковых карт, карта целых карт (при условии, что вы уже знакомы с ограниченным числом типов значений)

По какой причине вы имеете общее количество?

0 голосов
/ 09 августа 2011

(редактировать: о, извините, я понял сейчас)

Вот в чем дело: приведенный выше код не работает. Параметры типа стерты , поэтому приведенное выше совпадение ВСЕГДА вернет true - попробуйте, например, key2.

Если вы хотите хранить несколько типов на Map и извлекать их позднее, вам нужно будет использовать Manifest и специализированные get и put методы. Но это уже были ответы о переполнении стека, поэтому я не буду повторяться здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...