2013-08-03 58 views
0

我对scala和编程一般都很陌生(仅仅为了好玩),我试图理解尾递归和集合,但调试非常困难。斯卡拉尾递归在2个列表之间相交

我有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” 引用 “引用” 和 “援引” 也引述 “quoters”。

在这个例子中,:

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

我想找到的 “quoters” 说帖圈 “援引” 说帖 “quoters” ...

输出应该是这样的:

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) 
    } 
} 

我希望我足够清楚:/

谢谢提前 !

Felix

回答

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 

现在,想一想你正在用这些关联数组映射什么。您可以有效地构建图的邻接矩阵。你如何去查找有向图中的所有圆?

+0

嗨Giorgos,谢谢。我被我的数据结构困住了(你的清洁程度要好得多......)是的,我应该去找一个有向图。更简单! – user2648879