1
votes

comment ajouter un crochet vide dans un tableau de chaîne

Donné

[
  [
    "1,2,r",
    "2,2,r"
  ],
  [
    "1,3,r"
  ],
  [],
  []
]

puis

[
  [
    "1,2,r",
    "2,2,r"
  ],
  [
    "1,3,r"
  ],
  [""],
  [""]
]

sérialise avec Json.toJson à

val pp = ss.toArray.groupBy(_._2).toSeq.sortBy(_._1).toList.map(f => {
  f._2.map {
    case (x, y, z) => if (z == "r") { // when z == "s" || z =="p" empty bracket will be added
      s"$x,$y,$z"
    } else {
      ""
    }
  }
})

mais la sortie JSON devrait ressembler à ceci

val ss = List((1, 2, "r"), (2, 2, "r"), (1, 4, "r"), (1, 5, "p"), (1, 6, "s"))


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser flatMap + Option comme suit

List(List(1,2,r, 2,2,r), List(1,4,r), List(), List())
val ss = List((1, 2, "r"), (2, 2, "r"), (1, 4, "r"), (1, 5, "p"), (1, 6, "s"))
val pp = ss
  .groupBy(_._2)
  .toSeq
  .sortBy(_._1)
  .map(_._2.flatMap {
    case (x, y, z) if z == "r" =>
      Option(s"$x,$y,$z")
    case _ => 
      None
  })

println(pp)


3 commentaires

Merci, pour la réponse ont essayé votre code, pp que je reçois est seq [List [String]], et je veux une réponse dans Array [Array [String]]. donc, j'ai converti pp en ce tableau [Array [String]]. Mais, une seule parenthèse vide a été ajoutée et la deuxième n'a pas été ajoutée lorsque j'ai représenté cela au format json. Json.toJson (Array [Array [String]])


@varsha Array est un type Java et non un type Scala, donc généralement le code Scala utilise List ou Vector pour ce genre de chose.


d'accord, mais pouvez-vous me dire pourquoi une seule parenthèse vide est ajoutée et non la deuxième dans la liste.



3
votes

La solution simple consiste à utiliser collect plutôt que map dans le code interne. Vous pouvez également supprimer certaines des conversions de type sans modifier la logique:

ss.groupBy(_._2).toArray.sortBy(_._1).map {
  _._2.toArray.collect {
    case (x, y, z) if z == "r" =>
      s"$x,$y,$z"
  }
}

Si vous voulez Array [Array [String]] (comme suggéré dans les commentaires ) faites ceci:

ss.groupBy(_._2).toList.sortBy(_._1).map {
  _._2.collect {
    case (x, y, z) if z == "r" =>
      s"$x,$y,$z"
  }
}


0 commentaires

3
votes

Notez la différence entre List

scala> List(new String())
val res4: List[String] = List("")

scala> .length
val res5: Int = 1

et List vide d'un élément qui se trouve être vide String code>

scala> List("")
val res2: List[String] = List("")

scala> .length
val res3: Int = 1

Il est peut-être plus clair de voir que la chaîne vide "" représente une valeur réelle comme celle-ci

scala> List.empty[String]
val res0: List[String] = List()

scala> .length
val res1: Int = 0


0 commentaires