-1
votes

Comment vérifier si l'élément existe ou non dans une liste [tout] à l'aide de Scala

J'ai une liste comme les suivantes: xxx pré>

Je veux vérifier si src_999 code> existe. p>

J'ai essayé ce qui suit : P>

error: value contains is not a member of Any
mapped.foreach(a => print(a._1.contains("SRC_999")))


0 commentaires

3 Réponses :


1
votes

Comment puis-je résoudre ce problème?

En ne pas avoir une liste [Any] .

En ayant une liste [tout] , vous indiquez explicitement SCALA que les éléments pourraient être n'importe quoi . Cela signifie que Scala ne sait rien sur les éléments. Il ne sait même pas s'ils ont une méthode ou non. Les éléments pourraient être entiers, par exemple, qui n'ont pas de contiennent la méthode .


2 commentaires

J'ai essayé cela aussi map_temp.map (_. AsinStance de [(chaîne, chaîne)]).


map_temp.foreach (a => si (a._1.contains ("src_999")) {imprimer ("oui sort")}) Résultats: java.lang.classcastException: scala.collection.immutable. $ Colon $ Colon ne peut pas être jeter à java.lang.string



0
votes

Cela devrait faire ce que vous voulez:

def find[A, B](input: List[(List[A], B)], what: A): Option[B] =
  input.find(_._1.contains(what)).map(_._2)

// should be found
assert(find(map_temp, "SRC_999") == Some("TRGT_123"))
assert(find(map_temp, "SRC_888") == Some("TRGT_888"))

// should not be found
assert(find(map_temp, "SRC_998") == None)
assert(find(map_temp, "TRGT_123") == None)


10 commentaires

Salut Stefanobaghino,


Je reçois comme liste [tout] depuis comme ci-dessous. var r = list.range (0, inst.chargent.length) var srcchars1 = r.map {i => if (1 == 1) inst.Charmappe (i) .srcchars.get d'autre i} var tgtchar1 = r. map {i => if (1 == 1) inst.chargent (i) .tgtchar.get d'autre i} map_temp = srcchars1 zip tgtchar1


Comment l'obtenir comme liste [(Liste [String], String)]?


Donc, je suppose que le 1 == 1 dans si les conditions sont des espaces réservés pour autre chose, car ils vont bien sûr toujours évaluer à vrai . Si vous pouvez les supprimer, je recommanderais de le faire. Si vous ne pouvez pas, considérez que le type renvoyé par un si expression doit être un type super des deux branches. Par exemple, le type de si (true) 4 autre "4" est le type Super commun le plus proche à 4 de type int et et "4" de type chaîne , qui se trouve être tout . Drop the si ou assurez-vous que les deux branches renvoient une liste list [string] pour srcchars1 et a chaîne pour TGTChar1 .


Pour la fonction que vous avez écrite, est-il un moyen d'obtenir la seule valeur de chaîne de la liste [(Liste [String], String)] Si SRC_999 quitte


Voulez-vous dire quelque chose avec une signature comme def trouver [A, B] (entrée: liste [(liste [A], b)], Quoi: a): option [b] , où dans votre cas a s et b s sont chaîne s? Si tel est le cas, j'ai mis à jour ma réponse (avis que j'ai utilisé l'ancien nom Rechercher pour la nouvelle méthode et j'ai renommé Rechercher sur Existe . Ces noms correspondent mieux à ce qui se passe, comme vous pouvez le dire aux méthodes de bibliothèque standard que j'utilise.


Je vous demande de suggérer une sortie de projet de méthode comme B au lieu de certains (b)


J'ai essayé de passer la sortie de la partie de code que vous avez écrite à la fonction ci-dessous. Def show (x: option [string]) = x correspondez {case (s) => s case non => "?" } Ça marche. Mais est toujours là quand même pour obtenir le premier puits d'oeuvre elle-même comme b au lieu de certains (b)


Je ne le recommanderais pas, car vous devez exprimer que cette méthode peut finir par ne pas trouver l'article que vous recherchez. Si vous allez bien avec null S dans votre codeBase, vous pouvez utiliser ornull . Si vous préférez avoir une valeur par défaut, vous pouvez utiliser getorelse .


Alors, était-ce utile?



0
votes

Le map_temp La valeur est Liste [(Liste [String], String)]] , pas Liste [Any] . Vous pouvez vérifier l'élément que vous recherchez comme ceci: xxx


0 commentaires