2017-06-25 26 views
0

我正在斯卡拉做scala课程。我正在经历第6周的任务。我创建了一个函数来查找单词中出现的字符。测试方法在预期结果序列方面失败。斯卡拉coursera分配方法失败测试

下面是问题描述:

/** A word is simply a `String`. */ 
type Word = String 
/** Converts the word into its character occurrence list. 
* 
* Note: the uppercase and lowercase version of the character are treated as the 
* same character, and are represented as a lowercase character in the occurrence list. 
* 
* Note: you must use `groupBy` to implement this method! 
*/ 

def wordOccurrences(w: Word): Occurrences = { 

    def breakWord(s: List[Char], xs: List[(Char, Int)]): List[(Char, Int)] = s match { 
    case Nil => xs 
    case char :: rest =>  breakWord(s.tail, matchTuple(xs, char)) 
    } 

    breakWord(w.toList, List[(Char, Int)]()) 
} 

def matchTuple(tupleList: List[(Char, Int)], char: Char): List[(Char, Int)] = tupleList match { 
case Nil => tupleList:+ (char.toLower, 1) 
case pair :: restOfList => { 
    if(pair._1.toLower == char.toLower) 
     restOfList :+(pair._1, pair._2+1) 
    else 
     tupleList:+ (char.toLower, 1) 
    } 
} 

可有人请指出我在做什么错。我不需要一个直接的答案,只是逻辑提示我的序列出了什么问题。下面是测试及其结果:

assert(wordOccurrences("Robert") === List(('b', 1), ('e', 1), ('o', 1), ('r', 2), ('t', 1))) 

这里是输出:

[info] - wordOccurrences: Robert *** FAILED *** 
[info] List((o,1), (b,1), (e,1), (r,2), (t,1)) did not equal List((b,1), (e,1), (o,1), (r,2), (t,1)) (AnagramsSuite.scala:20) 

更新: 重构我的功能:

def wordOccurrences(w: Word): Occurrences = { 

    def breakWord(s: List[Char], xs: List[(Char, Int)]): List[(Char, Int)] = s match { 
     case Nil => xs 
     case char :: rest =>  breakWord(s.tail, xs:+ (char, 1)) 
    } 

    breakWord(w.toList, List[(Char, Int)]()).groupBy(pair => pair._1.toLower) 
     .map(entry => (entry._1.toLower, (entry._1.toLower, entry._2.size))) 
     .values.toList.sorted 
    } 

它看起来太糟糕了,但我将努力进一步改进此方法。

+1

你指示(指令!)使用的'groupBy'在哪里? – jwvh

+0

没有得到如何调用它。将研究如何在这里使用它。 – kromastorm

+1

我推荐它。这可以用1行代码来解决。 'groupBy'是一个小而重要的部分。 – jwvh

回答

1

你可以指望从这个方法出现次数 -

def times(chars: List[Char]): List[(Char, Int)] = { 
    def rec(charList: List[Char], acc: List[(Char, Int)]): List[(Char, Int)] = charList match { 
    case Nil => acc 
    case x :: xs => rec(xs.filter(_ != x), (x, charList.count(_ == x)) :: acc) 
    } 
    rec(chars, List()) 
} 

在本周使用该方法4分配:)

+0

谢谢。我也曾想到这种方法。只是想通过第5周的教程后使用高级版本。这是一种实现新概念的方法吗? :-D – kromastorm

2

你得到的结果是好的,只是在不同的顺序,但任务似乎没有说任何关于特定顺序的要求。因此,您需要事后对其进行分类(在修改解决方案之前或之后使用groupBy)。您只需拨打sorted方法即可(或查找sortBy/sortWith)。

+1

OP没有在问题中包括这个,但是“Occurrences”的指令/描述明确指出:“...按字母顺序排序...” – jwvh

+0

@jwvh谢谢,修复。 –

+0

@jwvh:谢谢。可能这是我从问题陈述中遗漏的重要方面。 – kromastorm