Как проверить, содержится ли символ в строке? - PullRequest
1 голос
/ 20 февраля 2011

Я хочу проверить, содержит ли строка символ.Я пишу код палача.Например, вот слово для угадывания: "scala", но оно выглядит как "_ _ _ _ _" для пользователя.Предположим, что пользователь вводит букву 'a', тогда она должна выглядеть как "_ _ a _ a".

def checkGuess(){
if (result.contains(user_input)) {
    val comp = result.toCharArray
    for (i <- comp){
        if (user_input != comp(i))
            comp(i) = '_'
        comp(i)
        }
    val str = comp.toString
    }
}

Это правильно?

Заранее спасибо.

Ответы [ 3 ]

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

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

case class HangmanGame(goal: String, guesses: Set[Char] = Set.empty[Char]) {
  override def toString = goal map {c => if (guesses contains c) c else '_'} mkString " "
  val isComplete = goal forall { guesses.contains } 
  def withGuess(c: Char) = copy(guesses = guesses + c)
}

Тогда

val h = HangmanGame("scala")
h: HangmanGame = _ _ _ _ _

scala> val h1 = h.withGuess('a')
h1: HangmanGame = _ _ a _ a

scala> val h2 = h1.withGuess('l')
h2: HangmanGame = _ _ a l a

scala> val h3 = h2.withGuess('s')
h3: HangmanGame = s _ a l a

scala> val h4 = h3.withGuess('c')
h4: HangmanGame = s c a l a

scala> h4.isComplete
res5: Boolean = true

ОБНОВЛЕНИЕ

Хорошо, это выглядит как домашнее задание.Полагаю, джинна уже нет в бутылке, но если вы не быстро наберете скорость на Scala, вам будет очень трудно объяснить, как это работает.

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

Как насчет:

scala> def checkGuess(str: String, c: Char) = str.replaceAll("[^"+c+"]","_")
checkGuess: (str: String,c: Char)java.lang.String

scala> checkGuess("scala",'a')
res1: java.lang.String = __a_a

scala> def checkGuess2(str: String, C: Char) = str map { case C => C; case _ => '_'}
checkGuess2: (str: String,C: Char)String

scala> checkGuess2("scala",'a')
res2: String = __a_a
0 голосов
/ 20 февраля 2011

Вот несколько комментариев о том, как вы это написали.При использовании этого синтаксиса, def checkGuess() { ... }, функция не будет возвращать никакого значения, вместо этого она будет возвращать Unit.

Это означает, что вы используете его только для побочного эффекта (такого как установка некоторой переменной за пределамиблок кода или печать некоторых значений).Проблема заключается в том, что вы не устанавливаете какое-либо значение или ничего не печатаете внутри функции (без печати, без присвоения).

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

def feedback(target:String, guesses:String): String = { 
  // target is the string to guess like "scala"
  // guesses are the letters that have been provided so far, like "ac"
  // last expression should be the feedback to print for instance "_ca_a"
}

Тогда вы можете думать о функции как о преобразовании каждой буквы в target с _ или с самим собой.в зависимости от того, содержится ли оно в guesses.Для этого target map { c => expr } будет работать очень хорошо, если вы поймете, как заставить expr вернуть c , если c находится в guesses и '_' в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...