Как оптимизировать эту простую функцию в Scala - PullRequest
0 голосов
/ 28 февраля 2011

Я написал простую функцию, чтобы заменить все символы b строки на *, а если она заканчивается на c, то заменить конец c на #.

Поэтому я пишу код как:

object Main {
    def fix(text: String) = {
        val s = text.replace("b", "*")
        if (s.endsWith("c")) {
            s.stripSuffix("c") + ("#")
        } else s
    }
    def main(args: Array[String]) {
        println(fix("abbbbccc")) // -> a***cc#
    }
}

Я думаю, что этот код не очень хорош, не в стиле scala-way. Поскольку я новичок в scala, я не знаю, как оптимизировать его в одну строку или просто цепочку?

Например:

def fix(text: String) = {
    text.replace("b", "*") op { t =>
        if (t.endsWith("c")) {
            t.stripSuffix("c") + ("#")
        } else t
    }
}

Это цепь, которую я ожидал. Обратите внимание на метод op, надеюсь, есть такой метод, как map. Что нам не нужно определять переменную здесь.

Или в scala есть какой-то другой API, который может сделать этот метод всего одной строкой.

Ответы [ 3 ]

7 голосов
/ 28 февраля 2011

Лучше использовать регулярные выражения в таких случаях:

def fix(s: String) = s.replace('b', '*').replaceFirst("c$", "#")

Если вам нужна цепочка преобразования в одну строку:

def fix(s: String) =
 Some(s.replace('b', '*')).map(s => if(s.endsWith "c") s.init + "#" else s).get

или

def fix(s: String) =
 Some(s).filter(_ endsWith "c").map(_.init + '#').getOrElse(s).replace('b', '*')

(вы также можете использовать «матч», но это занимает более одной строки)

1 голос
/ 28 февраля 2011

Если вам нравятся регулярные выражения, вы можете сделать:

def fix(text: String) = {
  val EndsWithc = """(.*)c$""".r
  text.replace('b', '*') match { case EndsWithc(s) => s + "#" ; case t => t }
}
1 голос
/ 28 февраля 2011

Как вы действительно надеетесь увидеть своего оператора "op":

text.replace("b", "*") match {
    case t if (t.endsWith("c")) => t.stripSuffix("c") + ("#")
    case t => t
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...