我认为我的问题很简单-我有一个用'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?
}
谢谢! ^^
答案 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
}
}