Почему мое выражение не возвращается в Scala? - PullRequest
0 голосов
/ 13 января 2020

У меня есть следующий код:

def foo(str: String, key: Char) : String = {

  breakable{
    for(it <- 0 until str.length){
      if(str.charAt(it) != key){
        str.slice(0, it) + str.slice(it+1, str.length)
        break
      }
    }
  }
  str
}

Однако, str.slice(0, it) + str.slice(it+1, str.length) никогда не возвращается, только ул.

Кто-нибудь знает, как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 13 января 2020

Это должно быть сделано в двух частях. Сначала вы найдете индекс этого символа в строке (если он существует). Теперь, если вы найдете индекс, вы вернете нарезанную строку, в противном случае вернет исходную строку.

Я предполагаю, что вы не можете использовать некоторые методы String для непосредственного выполнения этого ...

Если вы используете Scala 2.13

def foo(string: String, key: Char): String = {
  val indexOption =
    string
      .lazyZip(LazyList.from(0))
      .find({ case (c, i) => c == key })
      .map({ case (c, i) => i })

  indexOption
    .map(index => string.slice(0, index) + string.slice(index + 1, string.length))
    .getOrElse(string)
}

Или, если вы используете Scala 2.12,

def foo(string: String, key: Char): String = {
  val indexOption =
    string
      .toStream
      .zipWithIndex
      .find({ case (c, i) => c == key })
      .map({ case (c, i) => i })

  indexOption
    .map(index => string.slice(0, index) + string.slice(index + 1, string.length))
    .getOrElse(string)
}
0 голосов
/ 13 января 2020

str - это значение val, и оно не обновляется в ваших операциях ... вы игнорируете результат добавления этой строки

в значительной степени ваш код точно такой же, как:

def foo(str: String, key: Char) : String = str

попробуйте использовать переменную var, если вы хотите постоянно обновлять результат, или использовать другие методы над строкой, чтобы добиться того же самого без var ... с переменной var это может выглядеть примерно так:

import util.control.Breaks._
def foo(str: String, key: Char) : String = {
  var bar = str
  breakable {
    for(it <- 0 until str.length){
      if(str.charAt(it) != key){
        bar = str.slice(0, it) + str.slice(it+1, str.length)
      break
     }
    }
  }
  bar 
}

edit: Поскольку вы прокомментировали, вы не должны использовать var в своем назначении, рассмотрите foldLeft, чтобы решить ту же проблему:

def foo(str: String, key: Char): String = {
  string
    .foldLeft("") {
      case (acc, c) =>
        if(c == key) acc
        else acc + c
    }
}
...