Работа со строками и объектами - PullRequest
0 голосов
/ 02 июля 2018

Я думаю, что моя проблема довольно проста - у меня есть текстовый файл, состоящий из символов 'E' и 'B', например:

EBBEBBB BBEB
         E
BEB BEB  B
B

Теперь я хочу получить эти данные. Когда я использую его, я не хочу, чтобы он был в форме строк, потому что вы можете передать все, что не будет работать, например что-то вроде числа или любого другого недопустимого символа. Вот почему я решил, что могу создать несколько объектов case, которые расширяют одну черту (как показано ниже). Проблема в том, что я не знаю, как мне ПРАВИЛЬНО преобразовывать мои строковые данные в конкретную структуру данных, которую я создал:

sealed trait EB
case object E extends EB
case object B extends EB

case class EB_Text(data: Vector[EB])

def convertText(fileData: Vector[String]) : EB_Text = {
  //Match each symbol and check if it's 'E' or 'B' ?
  //If i find an invalid symbol here, what do i return? Should i return AN Option here?
}

Спасибо! ^^

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы можете построить функцию следующим образом

def convertText(fileData: Vector[String]) : EB_Text = {
EB_Text(fileData.map{
  singleLine =>
    singleLine.replaceAll(" ","").toUpperCase().collect{
      case 'E' => E
      case 'B' => B
    }
}.flatten)
}

Вам не нужно вносить какие-либо изменения в объекты case, которые вы определили ранее. Вы можете оставить их как есть

sealed trait EB
case object E extends EB
case object B extends EB

case class EB_Text(data: Vector[EB])

При вызове функции со следующим вводом вы получите вывод как

val input = Vector("EBBEBBB BBEB","         E","BEB BEB  B","  B ")
convertText(input)

вы получите вывод как

res0: EB_Text = EB_Text(Vector(E, B, B, E, B, B, B, B, B, E, B, E, B, E, B, B, E, B, B, B))

Надеюсь, это ответит на ваш вопрос.

0 голосов
/ 02 июля 2018

Ваша логика верна, и возвращение параметров звучит как правильная вещь. Если вам не нужна эта опция (или любая другая информация, связанная с операцией преобразования, например, лежащая в основе строка), нет причин для ее создания.

Я также не думаю, что необходимо обернуть результат в класс кейса.

    def convertText(fileData: Vector[String]) : Vector[EB] = {
        for (s <- fileData if s == "E" || s == "B") yield {
            if (s == "E") E
            else B
        }
    }
...