2016-08-24 1 views
-1

je Array[scala.collection.immutable.Map[String,Any]] et je dois les trier par la 2ème valeur "v2" et retourner un même tableau de carteTrier Tableau de carte par l'une des valeurs dans Scala

val col = Array(Map("key" -> Array("aa","bb"), "v1" -> 1 , "v2" -> 3),Map("key" -> Array("cc","bb"), "v1" -> 2 , "v2" -> 4)) 

Je l'ai fait ce qui suit:

scala> col sortBy {col("v2")} 
<console>:28: error: type mismatch; 
found : String("v2") 
required: Int 
      col sortBy {col("v2")} 

ou cette

scala> col sortWith {col("v2") > col("v2")} 
<console>:28: error: type mismatch; 
found : String("v2") 
required: Int 
      col sortWith {col("v2") < col("v2")} 

et je ne comprends pas ce que cela signifie required: Int et comment trier ce Array[Map[String,Any] !!

Edit:

J'ai essayé aussi bien

scala> col.toSeq.sortWith(col("v2").trim().toDouble > col("v2").trim().toDouble) 
<console>:32: error: type mismatch; 
found : String("v2") 
required: Int 
+3

Vos valeurs 'Map' sont de type' Any'. Comment avez-vous les valeurs de tri du compilateur de ce type? –

+0

vérifier la partie éditée @Yuval – Toren

Répondre

1

Vos collections sont Map[String, Any], pas Map[String, Int], de sorte que le compilateur ne sait pas que les éléments qu'il obtient sont comparables Int s. La chose la plus simple serait probablement d'utiliser asInstanceOf[Int] pour le convertir en quelque chose que vous pouvez trier.

col sortBy {_("v2").asInstanceOf[Int]}

Cependant, les valeurs non liées suggère un problème logistique; L'utilisation d'une classe personnalisée plutôt qu'une plaine Map est probablement préférable pour ce cas et supprimera le besoin de lancer quoi que ce soit.

+0

Merci @James, j'ai eu l'idée, mais j'ai toujours l'erreur de compilation: 'scala> col sortWith {col (" v2 "). AsInstanceOf [Int]} : 28: erreur: type incompatibilité ; trouvé: Chaîne ("v2") requis: Int col sortAvec {col ("v2"). AsInstanceOf [Int]} ' – Toren

+0

C'est ce qui se passe lorsque je ne vérifie pas les choses. Le 'col' interne devrait être l'argument de la boucle (changé dans la réponse ci-dessus). Cela devrait fonctionner maintenant. – James

1

Le code suivant fonctionnera en faisant une coulée explicite de la valeur v2 à Int (en supposant que v2 sera toujours un Int):

col.sortWith(_.getOrElse("v2",0).asInstanceOf[Int] > _.getOrElse("v2",0).asInstanceOf[Int])