0

我对 scala 和编程很陌生(只是为了好玩),我试图理解尾递归和集合,但调试真的很难。

我有 2 个清单:

val quoters = List[Map[String,List[String]]]

val quoted = List[Map[String,List[String]]]

前任 :

val quoters = List(Map("author1"->List("1","7","8")),Map("author2"->List("2","4","6","3")),Map("author3"->List("5","2","1","3")))
val quoted = List(Map("author1"->List("5","6")),Map("author2"->List("5","8","1")),Map("author3"->List("4")))

"quoters" 引用 "quoted" 和 "quoted" 也引用 "quoters"。

在示例中,:

 author1 quoted author2 with "1" and "8",
 author2 quoted author3 with "4",
 author3 quoted author1 with "5" & author2 with "5" + "1"

我想找到引用“引用”和引用“引用者”的“引用者”圈子......

输出应该是这样的:

val quotesCircle = List(
 Map("quoter"->"author1","receiver"->"author2","quote"->"4"),
 Map("quoter"->"author2","receiver"->"author3","quote"->"2"),
 Map("quoter"->"author3","receiver"->"author1","quote"->"1")
)

我的问题:

1/我认为我在滥用集合(Json 似乎太多了......)

2/我可以只与列表列表相交:

def getintersect(q1:List[List[String]],q2:List[List[String]])={ 
 for(x<-q1;r<-q2; if (x intersect r) != Nil)yield x intersect r
}

但不是地图列表的结构。

3/我为递归尝试了这个,但它不起作用,因为......好吧我真的不知道:

def getintersect(q1:List[List[String]],q2:List[List[String]])= {
    def getQuotedFromIntersect(quoteMatching:List[String],quoted:List[List[String]]):List[List[String]]={
     for(x<-q1;r<-q2; if (x intersect r) != Nil)
       getQuotedFromIntersect(x intersect r,quoted)
    }
}

我希望我足够清楚:/

先感谢您 !

菲利克斯

4

1 回答 1

0

我认为您的数据结构中多了一层。而且我可能会使用名称“作者”而不是“引用”,以避免由于引用/引用之间的协调而造成混淆:

val quoters = List(
  Map("author1"->List("1","7","8")),
  Map("author2"->List("2","4","6","3")),
  Map("author3"->List("5","2","1","3")))

val authors = Map(
  "author1" -> List(5, 6),
  "author2" -> List(5, 8, 1),
  "author3" -> List(4))

有了这个,还有一个像这样的小函数:

def findQuoters(article: Int): List[String] = {
  quoters.keys.toList filter { name =>
    quoters(name) contains article
  }
}

然后,您可以开始尝试不同的方法来收集和报告谁引用了哪个作者以及在哪里引用,例如:

// For each name in the 'authors' map:
//    For each article authored by this name:
//        Find all quoters of this article
//        Report that author 'name' has been quoted for article 'id' by 'whom'...

for (name <- authors.keys) {
  for (article <- authors(name)) {
    val qq = findQuoters(article)
    println("author %s has been quoted %d times for article %d by %s".format(
      name, qq.size, article, qq.mkString(" ")))
  }
}

打印输出如下:

author author1 has been quoted 1 times for article 5 by author3
author author1 has been quoted 1 times for article 6 by author2
author author2 has been quoted 1 times for article 5 by author3
author author2 has been quoted 1 times for article 8 by author1
author author2 has been quoted 2 times for article 1 by author1 author3
author author3 has been quoted 1 times for article 4 by author2

现在,考虑一下您使用这些关联数组映射的内容。您可以有效地构建图的邻接矩阵。您将如何在有向图中找到所有圆?

于 2013-08-04T03:05:28.987 回答