Scala:逐行读取文件并转换为数组列表

3
我正在逐行读取文件,并将其放入列表中。 因此,如果我的文件有10行,则有十个列表。现在,在此过程中或之后,我想将所有列表添加到数组中。因此,我有一个列表的数组,而不使用“var”,基本上只是“val”。 到目前为止,这是我所拥有的:
    val fileLines = Source.fromFile(filename).getLines.toList

    for (line <- fileLines) {
    if (!line.isEmpty) 
     println((line.toList).filter(e => e != ' '))
    }

我只是将每一行转换成列表并删除空元素。如何从此生成一个列表的数组?该数组类型为val而非try var。

1
很有趣!有些帖子说..“这闻起来像作业,标记为作业”,然后那篇帖子就被点赞了12次。现在,你又这样说了!嗯..不管怎样,我明白了! - madCode
你可能需要重新表达/编辑这个问题。你说10行会产生十个列表,我想你的意思是一个有10个项目的列表?这是很大的区别。 :/ - akauppi
1个回答

8
你可以尝试这样做:

你可以尝试以下方法:

val myArray = fileLines.filterNot(_.isEmpty).map { line =>
    (line.toList).filter(e => e != ' ')
}.toArray

这将给你一个列表元素的数组。如果你想要一个列表的列表,可以在结尾处删除.toArray


我知道这个问题。但是,在Scala中打印数组时,为什么会打印对象呢?我该如何获取数组列表中的第(n,n)个元素? - madCode
1
在上面的例子中,如果你使用println(myArray),它只会调用对象的.toString()方法并显示输出。要在列表中查找特定的内容,可以使用foreach迭代元素和/或使用类似于find()、collect()或filter()方法的List来获取特定的元素。再结合zipWithIndex,你也将有访问索引位置的权限。对于数组,你只需要引用位置,例如:myArray(2) - 只需确保指定的位置在边界内即可。 - jcern
但是,我无法在上面运行foreach,因为列表的元素(例如,myArray(i))的类型为“Any”。 - madCode
在原始示例中,它是 - 但在我的示例中,它应该有一个类型:Array[List[Char]]。最初它是 [Any] 的原因是 if 语句的 else 部分没有返回一个带类型的值。在我的示例中,我删除了 if,并用 filterNot 替换它来消除这个问题。 - jcern
太棒了,我明白了!看起来需要相当长的时间,才能开始以“函数式”的方式思考。有什么建议可以让我变得更好吗? - madCode
这肯定需要一些适应,但是当你掌握了它的要领后,就会感觉很棒。最简单的方法其实就是不断练习。查看你可能使用的任何库的源代码非常有帮助,尝试在这里回答问题也很有帮助——试图找出答案并看到其他人的解决方案对提高水平非常有帮助。 - jcern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接