2015-02-02 2 views
0

Ниже код пытается подсчитать количество раз, когда «Яблоко» появляется в файле HTML.Подсчет числа слов в файле

object Question extends App { 

    def validWords(fileSentancesPart: List[String], wordList: List[String]): List[Option[String]] = 
    fileSentancesPart.map(sentancePart => { 
     if (isWordContained(wordList, sentancePart)) { 
     Some(sentancePart) 
     } else { 
     None 
     } 

    }) 

    def isWordContained(wordList: List[String], sentancePart: String): Boolean = { 

    for (word <- wordList) { 
     if (sentancePart.contains(word)) { 
     return true; 
     } 
    } 

    false 

    } 

    lazy val lines = scala.io.Source.fromFile("c:\\data\\myfile.txt" , "latin1").getLines.toList.map(m => m.toUpperCase.split(" ")).flatten 

    val vw = validWords(lines, List("APPLE")) .flatten.size 

    println("size is "+vw) 


} 

Число 79 в соответствии с кодом Scala. Но когда я открываю файл текстовым редактором, он находит 81 слово с «Apple». Поиск не зависит от регистра. Может определить, где ошибка? (Я предполагаю, что ошибка с моим кодом и не текстовый редактор!)

Я написал пару тестов, но код кажется, ведут себя, как ожидается, в этих простых случаях использования:

import scala.collection.mutable.Stack; 
import org.scalatest.FlatSpec; 
import org.scalatest._; 

class ConvertTes extends FlatSpec { 

    "Valid words" should "be returned" in { 

    val fileWords = List("this" , "is" , "apple" , "applehere") 
    val validWords = List("apple") 

    lazy val lines = scala.io.Source.fromFile("c:\\data\\myfile.txt" , "latin1").getLines.toList.map(m => m.toUpperCase.split(" ")).flatten 

    val l : List[String] = validWords(fileWords, validWords).flatten 

    l.foreach(println) 

    } 

    "Entire line " should "be returned for matched word" in { 

    val fileWords = List("this" , "is" , "this apple is an" , "applehere") 
    val validWords = List("apple") 

    val l : List[String] = validWords(fileWords, validWords).flatten 

    l.foreach(println) 

    } 


} 

файл HTML разбираемый (упоминаемый как "C: \ Data \ myfile.txt") в коде выше:

https://drive.google.com/file/d/0B1TIppVWd0LSVG9Edl9OYzh4Q1U/view?usp=sharing

Любые предложения по альтернативам код выше прием.

Подумайте, что моя проблема соответствует @Jack Leow comment. Для кода:

val fileWords = List("this", "is", "this appleisapple an", "applehere") 
    val validWords = List("apple") 

    val l: List[String] = validWords(fileWords, validWords).flatten 

    println("size : " + l.size) 

размер Печатаемая 2, когда оно должно быть 3

+0

Просто просматривайте код очень быстро, если в одной строке файла содержится слово «APPLE» дважды, ho w что подсчитано? –

+0

@JackLeow Я думаю, что это действительно моя проблема, см. Обновление –

+0

"(? I) apple" .r findAllIn "this appleisApple a" size –

ответ

0

Я думаю, что вы должны сделать следующее:

def validWords(
    fileSentancesPart: List[String], 
    wordList: List[String]): List[Option[String]] = 

    fileSentancesPart /* add flatMap */ .flatMap(_.tails) 
    .map(sentancePart => { 
     if (isWordContained(wordList, sentancePart)) { 
     Some(sentancePart) 
     } else { 
     None 
     } 
    }) 

def isWordContained(
    wordList: List[String], 
    sentancePart: String): Boolean = { 

    for (word <- wordList) { 
    //if (sentancePart.contains(word)) { 
    if (sentancePart.startsWith(word)) { // use startsWith 
     return true; 
    } 
    } 
    false 
} 
0

Вы можете использовать регулярные выражения с Source итератора:

val regex = "([Aa]pple)".r 
val count = Source.fromFile("/test.txt").getLines.map(regex.findAllIn(_).length).sum 
Смежные вопросы