J'ai une liste comme les suivantes: Je veux vérifier si J'ai essayé ce qui suit : P> src_999 code> existe. p> error: value contains is not a member of Any
mapped.foreach(a => print(a._1.contains("SRC_999")))
3 Réponses :
Comment puis-je résoudre ce problème? p> blockQuote>
En ne pas avoir une liste
[Any] code>. P>En ayant une liste
[tout] code>, vous indiquez explicitement SCALA que les éléments pourraient être n'importe quoi em>. Cela signifie que Scala ne sait rien sur les éléments. Il ne sait même pas s'ils ont une méthode code> code> ou non. Les éléments pourraient être entiers, par exemple, qui n'ont pas decontiennent la méthode code>. P>
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
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)
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 code> dans si les conditions code> sont des espaces réservés pour autre chose, car ils vont bien sûr toujours évaluer à vrai code>. Si vous pouvez les supprimer, je recommanderais de le faire. Si vous ne pouvez pas, considérez que le type renvoyé par un si code> expression doit être un type super des deux branches. Par exemple, le type de si (true) 4 autre "4" code> est le type Super commun le plus proche à 4 code> de type int code> et et "4" code> de type chaîne code>, qui se trouve être tout code>. Drop the si code> ou assurez-vous que les deux branches renvoient une liste list [string] code> pour srcchars1 code> et a chaîne code> pour TGTChar1 code>.
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] code>, où dans votre cas a code> s et b code> s sont chaîne code> s? Si tel est le cas, j'ai mis à jour ma réponse (avis que j'ai utilisé l'ancien nom Rechercher code> pour la nouvelle méthode et j'ai renommé Rechercher code> sur Existe code> . 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 code> S dans votre codeBase, vous pouvez utiliser ornull code>. Si vous préférez avoir une valeur par défaut, vous pouvez utiliser getorelse code>.
Alors, était-ce utile?
Le map_temp code> La valeur est Liste [(Liste [String], String)]] Code>, pas Liste [Any] Code>. Vous pouvez vérifier l'élément que vous recherchez comme ceci: