如何在不抛出异常的情况下将字符串读入枚举?

rum*_*cho 2 enumeration scala

我有一些数据为.csv.它手动输入到Excel中,我必须将其加载到Scala程序中.

单个记录的大多数字段都是自由文本字符串或数字,但是少数字段来自预先指定的可能字符串的短列表.我为这类信息创建了枚举,比如

object ScaleType extends Enumeration {
    val unknown = Value("unknown")
    val nominal = Value("nominal")
    val ordinal = Value("ordinal")
    val interval = Value("interval")
    val ratio = Value("ratio")
}
Run Code Online (Sandbox Code Playgroud)

我将csv读入Iterator [Array [String]],对于每一行,我创建一个scala类的新实例,从行中的信息设置其属性.假设在csv中,它是line(8),告诉我们我们使用的比例类型.所以,line是的Array[String],line(8)是一个字符串,其内容应在枚举中列出的值之一.

由于数据是手动输入的,因此包含错误.我使用if语句来查明是否line(8)完全为空,但我无法弄清楚如何查看我得到的字符串是否是一个缩放类型.

val scale = if(line(8).length > 0)
            {
                ScaleType.withName(line(8))
            }
        else ScaleType.unknown
Run Code Online (Sandbox Code Playgroud)

我今天准备这样的情况发生:如果有人已经进入规模型"rtnl",我想上面的设置VAL scaleScaleType.unknown并记录问题(像print("scale reading error on line " + lineNumber就足够了).相反,抛出异常,我不知道如何在异常发生之前检查问题.

Lee*_*Lee 6

你可以使用ValueSet.find:

val scale = ScaleType.values.find(_.toString == line(8)).getOrElse(ScaleType.unknown)
Run Code Online (Sandbox Code Playgroud)

如果效率太低,你可以创建一个地图:

val lookup = ScaleType.values.map(v => (v.toString, v)).toMap
val scale = lookup.get(line(8)).getOrElse(ScaleType.unknown)
Run Code Online (Sandbox Code Playgroud)