处理字符串和对象

时间:2018-07-02 11:09:45

标签: scala traits

我认为我的问题很简单-我有一个用'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 :(得分:2)

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

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

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

答案 1 :(得分:1)

您的逻辑是正确的,并且返回选项听起来像是正确的事情。但是,如果您不需要该选项(或与转换操作相关的任何其他信息,例如基础字符串),则无需构造它。

我也不认为将结果包装在case类中是必需的。

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