Coursera scala赋值对象:第3周下降ByRetweet

时间:2017-05-21 23:33:42

标签: scala

我想弄清楚我的Scala课程,第三次作业的解决方案有什么不对。除了将TweetSet转换为降序tweetList的方法之外,我已经找到了其他所有内容。

以下是主要方法:mostweetweeted for Non-Empty Set。

def mostRetweeted: Tweet = {
    val mostRetweetedLeft = left.mostRetweeted
    val mostRetweetedRight = right.mostRetweeted

    if(mostRetweetedLeft != null && mostRetweetedRight!=null)
      if(elem.retweets > mostRetweetedRight.retweets && elem.retweets > mostRetweetedLeft.retweets)
        return elem
      else if(elem.retweets > mostRetweetedRight.retweets && elem.retweets < mostRetweetedLeft.retweets)
        return mostRetweetedLeft
      else
        return mostRetweetedRight
    else if(mostRetweetedLeft == null && mostRetweetedRight!=null)
      if(elem.retweets > mostRetweetedRight.retweets)
        return elem
      else
        return mostRetweetedRight
    else if(mostRetweetedLeft != null && mostRetweetedRight==null)
      if(elem.retweets > mostRetweetedLeft.retweets)
        return elem
      else
        return mostRetweetedLeft
    else
      return elem

  }

mostRetweeted for empty Set

def mostRetweeted: Tweet = null

最后这个方法,使用累加器通过上述方法形成列表来计算转发最多的推文。

   def descendingByRetweet: TweetList = {

          def descendingByRetweet(tweetSet: TweetSet, tweetList : TweetList):TweetList = {

            val mostTweeted:Tweet = tweetSet.mostRetweeted
            // empty set returns null for mostRetweeted method
            if(mostTweeted == null)
              return tweetList
            else {

              descendingByRetweet(tweetSet.remove(mostTweeted),tweetList.add(mostTweeted))
            }

          }
          descendingByRetweet(this,Nil)
}

您可能已经注意到我向TweetList添加了一个add方法 对于Nil

def add(tweet: Tweet): TweetList = new Cons(tweet,Nil)

对于缺点

def add(tweet: Tweet): TweetList = new Cons(head,tail add tweet)

我也尝试了一些在线解决方案,但那些也没有用。 https://coderwall.com/p/_akojq/scala-week-3 就像我的解决方案一样,这给了一个&#34;几乎&#34;降序列表,但列表并不是完全降序。无论如何,我已经度过了整整一天并完成了任务,所以我将继续下一周。

1 个答案:

答案 0 :(得分:1)

descendingByRetweet的代码看起来正确,以为可以写得更短。我认为你的问题可能在mostRetweeted方法中。在这部分代码中:

if(elem.retweets > mostRetweetedRight.retweets && elem.retweets > mostRetweetedLeft.retweets)
  return elem
else if(elem.retweets > mostRetweetedRight.retweets && elem.retweets < mostRetweetedLeft.retweets)
  return mostRetweetedLeft
else
  return mostRetweetedRight

考虑例如elem.retweets = 5mostRetweetedRight.retweets = 0mostRetweetedLeft.retweets = 5的情况。返回值为mostRetweetedRight,这显然是不正确的。您应该根据所需的结果将>=<=添加到其中一个if语句中。