2014-12-04 35 views
0

我有一个包含纯文本像这样的文件: “Umbrella!! This is a very red umbrella. The umbrella should not be this red.如何将文件中每行的单词与scala中的列表元素进行比较?

我提取其中的所有关键字(将所有单词小写后),并将它们按字母顺序排序,这给了我:

keywords = List(red, umbrella) 

现在,我想逐行读取文件,找到包含单词“红色”和“伞”的行号,即关键字列表中的单词。

我知道如何按行读取文件行:

for(line <- Source.fromFile("file.txt").getLines()) 

但是,我怎么在线路通过每个字分析,并将其与列表元素比较?请帮忙!!

编辑:

欲输出像:

red 2 3 
umbrella 1 2 3 

1 2 3是行号。

回答

0

你可以将每行分成单词,然后检查列表是否包含他所有的关键字。使用zipWithIndex得到行号:

Source.fromFile("file.txt").getLines().zipWithIndex.filter { case(line, index) => 
    val words = line.toLowerCase.split("\W") 
    keywords.forall(words.contains) 
} 
.map(_._2) 

编辑:如果您想为每个keywrod单独的索引,你要flatMap成(字,索引)元组列表,然后再组:

Source.fromFile("file.txt").getLines().zipWithIndex 
    .flatMap { case(line, index) => 
     line.toLowerCase.split("\W").map { (_, index+1) } // "+1 because indexes are 0-based 
    } 
    .filter { keywords.contains(_._1) } 
    .groupBy { _._1 }.mapValues(_._2) 

这给你一个Map [String,List [Int]],其中键是关键字,值是给定关键字出现的行的索引列表。

2

只需使用每一行和打印指数keywords.exists(line.contains)需要时

Source.fromFile("file.txt").getLines().zipWithIndex.foreach { 
    case(line, index) => 
     if (keywords.exists(line.contains)) println(index) 
} 

如果你希望它不区分sensetive,只是做line.toLowerCase.contains

Source.fromFile("file.txt").getLines().zipWithIndex.foreach { 
    case(line, index) => 
     if (keywords.exists(line.toLowerCase.contains)) println(index) 
} 

更新(以反映变化答案)

使输出类似于

red 2 3 
umbrella 1 2 3 

让我们创建一个存储每个单词的行号的映射。

var count = scala.collection.mutable.Map[String, List[Int]]() 
keywords.foreach { k => count += k -> List[Int]()} 
Source.fromFile("file.txt").getLines().zipWithIndex.foreach { 
    case (line, index) => 
    keywords.foreach { w => 
     if (line.toLowerCase.contains(w)) 
     count(w) = count(w) :+ (index + 1) 
    } 
} 
count.keys.foreach{ i => println(i + " " + count(i))} 

要使输出完全按照你规定的,由

count.keys.foreach{ i => 
        print(i + " ") 
         count(i).foreach{ j => print(j + " ") } 
         println() 
        } 
+0

我可以没有文件的内容在文件中使用toLowerCase向所有的字替换最后一行,让所有的话都小写在检查之前? – 2014-12-04 03:57:48

+0

是的,只是'line.toLowerCase.contains' – 2014-12-04 03:59:49

+0

但是,这只是给我输出为0 1 2,而我想输出为红色是1 2和伞为0 1 2.分别为每个关键词。 :O – 2014-12-04 04:06:44

相关问题