2013-06-05 6 views
3

У меня есть картаДоступ к значениям вложенного МАП

val m = Map(1->13, 2->Map(3->444, 4-> List("aaa", "bbb"))) 

Я хочу получить свои вложенные значения:

// these all lead to an error 
m.get(2)(3) 
m.get(2).get(3) 
m.get(2).get.get(3) 

Как я могу это сделать?

+0

Ваша проблема связана с тем, что внутри вашей карты вы смешиваете значения гетерогенных типов (некоторые из них являются картами, другие - нет), поэтому ваша карта интерпретируется как Map [Int, Any] (поскольку Any - это общий корень в иерархии типов для Int и Map.) Поскольку Any не имеет метода «get» или «apply», все заканчивается ошибкой. –

ответ

5

У вас есть lost type information.

Вы действительно можете делать то, что хотите, но это не типично.

m.get(2).flatMap{ case m2: Map[Int, _] => m2.get(3) } 

Поскольку вы потеряли информацию о типе вы должны отбрасывать в явном виде, так что если вы хотите, чтобы элемент списка Вам необходимо сделать что-то вроде этого:

m.get(2).flatMap{ case m2: Map[Int, _] => m2.get(4) }.map{ case l: List[_] => l(1) } 

Вы должны попытаться сохранить информацию о типе. По крайней мере, вы можете использовать Either.

+0

Наконец-то можно использовать класс adhoc –

+0

, что я хочу получить 2-й элемент List, как мне это сделать? –

+0

@ om-nom-nom: Параметры типа здесь не самая большая проблема. Вся идея хранения «Int» и «Map» в одном контейнере - это зло. – senia

1

У вас есть map, который имеет непоследовательные типы key-value пар. Следовательно, не может быть одного обобщенного ответа.

Во-первых m.get(2) возвращает Option[Any]. Ведение m.get(2)(3) в основном пытаются сделать:

val option = m.get(2) //option is of type Option[Any] 
option(3) //error 

Следовательно, вам нужно сделать:

m.get(2) match { 
case Some(i) => i match { 
    case j:Map[Any,Any] => j(3) 
    } 
} 

Что-то в этом роде.

Смежные вопросы