2014-11-05 59 views
0

我有一个矩阵,其中每个矢量由hashmaps组成。这里有一个玩具的例子:如何获得符合标准的矩阵中最长的连续序列?

[ 
    [{:label x, ...}, {:label y, ...}, ...] 
    [{:label y, ...}, {:label z, ...}, ...] 
    [{:label p, ...}, {:label x, ...}, ...] 
    ... 
    [{:label x, ...}, {:label x, ...}, ...] 
] 

因为只有标签与我的问题有关,所以我删除了其他东西。

现在,我想要做的是为每一行计算连续标签的最长序列。也就是说,如果一行的标签是A B B B A A C A,那么最长的序列是B B B。然后我想返回的是一个元组1)哪一行的最长序列号是k(如果是平局,最长的任何一个都可以),还有2)序列中第一项的索引i是什么,以及3)序列中最后一项的索引j是什么。

因此,对于这个简化的矩阵,那将是k = 1, i = 2, j = 5

[ 
    [A B B A A C] 
    [C B A A A A] 
    [B A C A B A] 
] 

我是功能编程的新手,我真的很喜欢它,但我不知道如何做到这一点,而不诉诸于例如。我的本地php的foreach循环。我不想找人为我做任何事情,但向正确的方向提示将非常感激。谢谢。

+2

也许'(分区的身份。)'将有助于https://clojuredocs.org/clojure.core/partition-by – ymonad 2014-11-05 03:13:48

+0

哦,听起来像, 谢谢!我现在要去睡觉,但我一定会在早上仔细看看。 – 2014-11-05 03:17:13

回答

2
(def m "ABBAAAC") 

(->> m (map-indexed vector) 
     (partition-by #(-> % second identity)) 
     (sort-by count >) 
     (first)) 

给出:

([3 \A] [4 \A] [5 \A]) 
+0

谢谢你,睿智!这工作正常。 – 2014-11-06 21:43:16

+1

WOHO互联网要点! \ o / – Henrik 2014-11-07 15:24:04