使用字符串和对象

Working with strings and objects

我认为我的问题很简单 - 我有一个由 'E' 和 'B' 符号组成的文本文件,例如:

EBBEBBB BBEB
         E
BEB BEB  B
B

现在我想获取这些数据。当我使用它时,我不希望它采用字符串形式,因为您可以传递任何不起作用的东西,例如数字或任何其他无效符号。这就是为什么我想我可以创建一些扩展单个特征的案例对象(如下所示)。问题是,我不知道我应该如何正确地将我的字符串数据转换为我制作的特定数据结构:

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?
}

谢谢! ^^

您的逻辑是正确的,返回选项听起来是正确的做法。如果您不需要该选项(或与转换操作相关的任何其他信息,例如底层字符串),则没有理由构造它。

我也不认为有必要将结果包装在一个案例中 class。

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

您可以通过以下方式构造函数

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

您不需要对之前定义的案例对象进行任何修改。你可以保持原样

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))

我希望这能回答您的问题。