【问题标题】:String splitting- splitting by hashtag [duplicate]字符串拆分-按标签拆分[重复]
【发布时间】:2020-01-02 22:14:15
【问题描述】:

我是 Scala 的新手,所以我一直在努力阅读文本文件。我正在尝试使用一个方法创建一个对象,该方法接受一个表示文件名的字符串并返回一个 int,它是值的总和。但是,文本文件令人讨厌地被主题标签分隔。

这是示例文本文件的样子:

3#1#8
12#9#25#10
-2#12
1#2


How do you split this?

【问题讨论】:

  • Source.fromFile(fileName).getLines().flatMap(_.split("#")).flatMap(_.toIntOption).sum
  • 哇,这还能做什么?
  • 该代码就是您所需要的。它应该适用于 Scala 2.13。如果您使用的是 2.12 或更早版本,toIntOption 不存在,但如果您确定所有值都是数字或 flatMap(str => Try(str.toInt).toOption),则可以轻松替换为 map(_toInt)。
  • 啊,看来我在 scala 2.12.10 上。也许这就是原因。
  • .mkString() 是一种流行的修复方法。其他人喜欢.toList 或.toSeq。还有一些更深奥的解决方案。

标签: scala


【解决方案1】:

没错。看:

scala> "A#B#C".split("#").toString // (*)
res2: String = [Ljava.lang.String;@24f3e13e

你可以这样做:

scala> "A#B#C".split("#").toList
res3: List[String] = List(A, B, C)

(*) 新的 REPL 没有从 java.lang.Array 调用 toString,并显示更令人愉悦的输出,所以我明确添加它来说明问题。

【讨论】:

  • 哦,好吧,我不知道这甚至是一个问题。所以每次我想检查发生了什么时,我都需要这样做吗?
【解决方案2】:

split 是一个 Java 方法,它返回 Java Array,默认情况下在 Scala 中打印不漂亮,而是打印为哈希码。为了漂亮地打印它尝试

import scala.runtime.ScalaRunTime.stringOf
println(stringOf("3#1#8".split("#")))

哪个输出

Array(3, 1, 8)

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多