2013-07-29 3 views
0

Как проверить, какой экземпляр является текущим объектом. В частности, проверьте, есть ли его Коллекция.Почему проверка типа вложенной коллекции в этом случае не выполняется?

val maps = Map("s" -> 2, "zz" -> 23, "Hello" -> "World", "4" -> Map(11 -> "World"), "23333" -> true); 

for(element <- maps) { 
    if(element.isInstanceOf[Map]) { // error here 
     print("this is a collection instance "); 
    } 
    println(element); 
} 
+0

Что такое ошибка, которую вы получаете? Что происходит, когда он «терпит неудачу»? –

+0

@AndrzejDoyle Я предполагаю, что Райан означал, что он просто обходит проверку вместо того, чтобы вступать в нее, если утверждение –

+0

@ om-nom-nom: Ошибка компиляции: 'error: type Map принимает параметры типа'. – senia

ответ

0

Если вы хотите, чтобы обнаружить какие-либо Map:

for(element <- maps) { 
    if(element.isInstanceOf[Map[_, _]]) { 
     print("this is a collection instance ") 
    } 
    println(element) 
} 

Но это не сработало, потому что вы проверить весь кортеж («S» -> 2 и т.д.), а второй элемент кортежа:

for(element <- maps) { 
    if(element._2.isInstanceOf[Map[_, _]]) { 
     print("this is a collection instance ") 
    } 
    println(element._2) 
} 

Или с сопоставления с образцом:

for((_, v) <- maps) { 
    if(v.isInstanceOf[Map[_, _]]) { 
     print("this is a collection instance ") 
    } 
    println(v) 
} 

Или с еще более сопоставления с образцом:

maps foreach { 
    case (_, v: Map[_, _]) => println("this is a collection instance " + v) 
    case (_, v)   => println(v) 
} 
+0

спасибо .. это тот, который я хотел. – Ryan

0

Чтобы иметь возможность скомпилировать фрагмент кода, измените его на

if (element.isInstanceOf[Map[_, _]]) { 

, но, как вы итерация «пар ключ/значение», он никогда не будет совпадение.


Так что, возможно, вы хотели что-то вроде этого: перебрать значения:

maps.values.foreach { 
    case (m: Map[_, _]) => println(s"Map: $m") 
    case x => println(x) 
} 

или если вы хотите перебрать пар ключ/значение:

maps foreach { 
    case (key, m: Map[_, _]) => println(s"Map: $key -> $m") 
    case (key, value) => println(s"$key -> $value") 
} 
Смежные вопросы