Estoy aprendiendo Scala y he estado tratando de crear un programa que debería reemplazar los caracteres de cada palabra con una cadena en orden alfabético. Por ejemplo, la cadena es "¿Dónde estás?", Por lo que el programa debería cambiarla a "Eehrw aer ouy". Busqué en Google la búsqueda y encontré algunos ejemplos, pero no puedo escribir un programa sin errores. Creo que estoy lejos de tener un programa de trabajo.

def main(args:Array[String]){
    val r = "Where are you"
    val newstr = r.map(x=>(x,_) match {
      case ' ' =   ' '
      case y =>  {
        val newchar = (x.toByte).toChar
        if newchar.toByte.toChar > (newchar + 1).toByte.toChar
        x = newchar
        else
        x
      }
   })
     }
1
shuru 23 oct. 2017 a las 04:20

3 respuestas

La mejor respuesta

La parte difícil es restaurar la capitalización original. Agregue puntuación a la mezcla y se convierte en un pequeño desafío divertido.

val str = "Where, aRe yoU?"
val sortedLowerCase = str.toLowerCase.split("(?=\\W)").map(_.sorted).mkString
val capsAt = str.indices.filter(str(_).isUpper)
capsAt.foldLeft(sortedLowerCase)((s,x) => s.patch(x,Seq(s(x).toUpper),1))
// res0: String = Eehrw, aEr ouY?

El tiempo dedicado a estudiar la Biblioteca estándar será ampliamente recompensado.

2
jwvh 23 oct. 2017 a las 04:57

r.split(" ").map(word => word.toLowerCase.sorted)

Para mantener las letras mayúsculas, en lugar de .toLowerCase.sorted, usó .sortWith e implementó la función de comparación de clasificación de acuerdo a cómo desea ordenar los caracteres.

1
Ren 23 oct. 2017 a las 01:28

Permítanme ampliar la respuesta de Ren:

Compare en minúscula y luego escriba en mayúscula solo si hay una letra mayúscula

r.split(" ").map(word => word.sortWith(_.toLower < _.toLower))
  .map(x => if (x.exists(_.isUpper)) x.toLowerCase.capitalize else x )
1
Ossip 23 oct. 2017 a las 19:51