2013-03-03 49 views
3

我想查找序列中元素上次出现的位置。测试我想出的一些解决方案,如何用Clojure查找最后出现元素的位置?

user> (def numbers (repeatedly 100 #(rand-int 100))) 
#'user/numbers 

user> (time ((zipmap numbers (range)) 22)) 
"Elapsed time: 0.865193 msecs" 
90 

user> (time (last (keep-indexed #(if (= 22 %2) %1) numbers))) 
"Elapsed time: 1.600483 msecs" 
90 

有没有一个更简洁的内置,这样做?

回答

1

你可以使用lastIndexOf你投的对象为正确的类型后:

(.lastIndexOf numbers (int 22)) 

的方法记录在这里:http://docs.oracle.com/javase/6/docs/api/java/util/List.html#lastIndexOf(java.lang.Object)

+1

是的,但要注意'.lastIndexOf'将在'LazySeq实际工作',只要你正在寻找正确类型的元素:'(.lastIndexOf numbers(int 22))'。文字'22'将被视为'long',否则即使列表中随机出现'22'也不会被发现。 – 2013-03-03 02:59:00

+0

@ A.Webb谢谢,我会更新我的答案。我想知道为什么它不直接在'LazySeq'上工作,但没有找到原因。 – ponzao 2013-03-03 12:46:39

+0

谢谢你们俩! – georgek 2013-03-03 16:12:13