2

我的教授正在使用 Horstmann 的书“不耐烦的 Scala”教我们 Scala,我们的一项家庭作业直接来自这本书;第 4 章,练习 2。

我们希望以文本格式阅读电子书,教授指定输入文件应为“Moby Dick”,可从 Gutenberg 项目免费获得:http: //www.gutenberg.org/ebooks/2701。 txt.utf-8

我的代码有效,就计算单词的实例而言。但是,他添加了要求,我们必须将输出格式化为两列,其中单词左对齐,计数右对齐。为此,我正在确定书中最长的单词,以便计算“单词”列的宽度。但是,我得到的字符串长度值是错误的。事实上,它告诉我所有的字符串都是相同的长度。"a" 被报告为长度 26,就像 "Whale"、"Ishmael" 等...

这是代码:

object Chapter4Exercise2 extends App {

  //for sorting
  import util.Sorting._

  //grab the file
  val inputFile = new java.util.Scanner(new java.io.File("moby.txt"))

  //create a mutable map where key/values == word/count
  val wordMap = collection.mutable.Map[String, Int]() withDefault (_ => 0)

  //for formatting output (later), the longest word length is relevant
  var longestWord = 0
  var theWord: String = ""

  //start reading each word in the input file
  while (inputFile hasNext) {
    //grab the next word for processing, convert it to lower case, trim spaces and punctuation
    var nextWord = inputFile.next().toLowerCase().trim().filter(Character.isLetter(_))
    //if it's the longest word, update both theWord and longestWord
    if (nextWord.size > longestWord) longestWord = nextWord.size; theWord = nextWord; println(theWord + " " + longestWord)
    //update the map value for the key with same value as nextWord
    wordMap(nextWord) += 1
  }

    println("Longest word is " + theWord + " at " + longestWord + " Characters")
}

这些行的输出:

    if (nextWord.size > longestWord) longestWord = nextWord.size; theWord = nextWord; println(theWord + " " + longestWord)

    println("Longest word is " + theWord + " at " + longestWord + " Characters")

很遥远。它告诉我输入文件中的每个单词都是 26 个字符长!

这是输出的一个小样本:

外壳 26

26日

26

冲浪26

海滩 26

和 26

然后 26

潜水 26

下降 26

进入 26

我错过了什么/做错了什么?

4

2 回答 2

4
if (nextWord.size > longestWord) longestWord = nextWord.size; theWord = nextWord; println(theWord + " " + longestWord)

你不应该像那样在一行上写多个语句。让我们把它写成多行并正确缩进:

if (nextWord.size > longestWord)
    longestWord = nextWord.size
theWord = nextWord
println(theWord + " " + longestWord)

你现在看到问题了吗?

于 2012-09-26T15:19:25.450 回答
0

尝试把你{}if 语句替代方案放在周围。

您可以通过以结构化方式格式化代码来避免这种陷阱 - 始终在代码块周围使用大括号。

 if (nextWord.size > longestWord) 
 {
      longestWord = nextWord.size; 
      theWord = nextWord; 
      println(theWord + " " + longestWord);
 }

您当前的代码相当于

 if (nextWord.size > longestWord) 
 {
      longestWord = nextWord.size; 
 }
 theWord = nextWord; 
 println(theWord + " " + longestWord);
于 2012-09-26T15:18:37.333 回答