【问题标题】:pattern matching in String ScalaString Scala 中的模式匹配
【发布时间】:2018-05-01 13:27:51
【问题描述】:

我写了上面的代码,根据一些规则来定义String的类型。

def dataType (input:String) : String = input match {
  case input if input.startsWith("Q")   => "StringType";
  case input if (input.startsWith("8") && !(input.contains("F"))) => "IntegerType"
  case input if (input.startsWith("8") && (input.contains("F"))) => "FloatType"
  case _                             => "UnknowType";
}

这段代码运行良好,但我想通过避免使用 If 语句来优化它。我希望它仅基于模式匹配而不使用任何 if 语句。 我试图以这种方式修改它,但它给了我不好的结果:

def dataType (input:String) : String = input match {
  case "startsWith('Q')"  => "StringType"
  case "startsWith('8') && !(contains('F')))" => "IntegerType"
  case "startsWith('8') && (contains('F')))" => "FloatType"
  case _                             => "UnknowType";
}

它总是给我 UnknownType 结果

请帮帮忙

最好的问候

【问题讨论】:

  • 你好,这是完全不同的,所以我不是在问一个已经回答的问题
  • 请不要破坏您的帖子。如果您认为您的问题没有用或不再有用,则应删除,而不是编辑掉所有实际使其成为问题的数据。通过在 Stack Exchange 网络上发布,您已授予 SE 分发该内容的不可撤销的权利(根据 CC BY-SA 3.0 许可)。根据 SE 政策,任何破坏行为都将被撤销。

标签: scala pattern-matching


【解决方案1】:

由于您正在检查包含 F 的首字母和布尔值,您可以创建这些情况的Tuple2[Char, Boolean] 并在match case 中使用它,如下所示

def dataType (input:String) : String = (input.charAt(0), input.contains('F')) match {

  case ('8', true) => "FloatType"
  case ('Q', _)  => "StringType"
  case ('8', false) => "IntegerType"
  case _ => "UnknowType"
}

你应该没事的

【讨论】:

  • 我不知道我们可以对元组进行模式匹配,这对我很有帮助,因为我必须处理不同元素中的多个条件。非常感谢您的宝贵回答
  • 我还有一个整数类型查询我必须根据数据长度区分两种子类型,我已经写了一个计算数据长度的函数
  • 你好 Ramesh,我问了一个新问题,它把你的答案作为输入,你可以检查一下吗:stackoverflow.com/questions/50120107/…
  • 这是不可取的,因为您总是计算包含。最好只使用case 8 => if (contains) one else other。有时模式匹配元组并在案例中看到漂亮的网格是很好的。
  • 是的,我同意你的看法@som-snytt,但 OP 想要在没有 if 表达式的情况下这样做:)
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 2018-04-12
  • 2015-10-06
  • 2012-10-31
  • 2016-05-17
  • 2021-12-17
  • 2016-03-29
  • 2019-05-26
相关资源
最近更新 更多