如何获取Scala中设置的子字符串的字典?

时间:2019-02-07 21:22:39

标签: python scala

我有一个名为“ wordAndPronounciation.txt”的文本文件,其中包含以下内容。预期的输出是单词作为关键字,单词之后的任何字符串都作为值串联在一起。

DEFINE  D IH0 F AY1 N
PHOTOGRAPH  F OW1 T AH0 G R AE2 F

输入:"wordAndPronounciation.txt"

输出:{"DEFINE": "DIH0FAY1N", "PHOTOGRAPH": "FOW1TAH0GRAE2F"}

在Python中,我可以做到

def wordAndPronounciation(filename):
    table = {}
    with open(filename,'r') as x:
        for i in x:
            table[i.split(' ', 1)[0]] = ''.join(i.split()[1:])
    return table

现在我该如何在Scala中做到这一点?

我尝试过,但是我认为这是不正确的。

for (line <- Source.fromFile(filename).getLines) {
        first, *middle, last = text.split()
        *middle = *middle.concat(last)
        table=Map(first -> *middle) }

还有一件事,是否有一种简单的方法可以在Scala中反转字符串? 在python中,我可以执行此操作,其中string = "CAT"和您 print(string[::-1])

我试图这样做以反转Scala中的字符串, var reversedC = ("" /: string)((a, x) => x + a),但它给出了参数错误。

2 个答案:

答案 0 :(得分:2)

这与您的Python代码大致相当。

def wordAndPronounciation(fileName: String): Map[String,String] =
  io.Source.fromFile(fileName)                      //open file
           .getLines()                              //read file line-by-line
           .map(_.split("\\s+"))                    //spit on spaces
           .map(a => (a.head, a.tail.reduce(_+_)))  //create tuple
           .toMap                                   //as dictionary

P.S。 "reverse".reverse //res0: String = esrever

答案 1 :(得分:1)

我不知道*middle Python 中用于存储事物列表的有效语法。但我确定它在 Scala 中无效。
其次,您的无所作为。除了table是可变的 var 之外,但在这种情况下,您不是在更新其内容,而是覆盖它。

您的问题可以通过这种方式解决。

val map = (for {
  line <- Source.fromFile(filename).getLines
  words = line.split(" ")
} yield words.head -> words.tail.mkString).toMap
// map: Map[String, String] = ...

与以下相同:

val map =
  Source
    .fromFile(filename)
    .getLines
    .map(line => line.split(" "))
    .map { case Array(head, tail @ _*) => head -> tail.mkString }
    .toMap

由于for / yield语句只是mapflatMapfilter调用的糖语法。

最后,要反转字符串,只需调用reverse方法

"Hello, world!".reverse
// res0: String = "!dlrow ,olleH"