2010-10-19 79 views
28

我想知道哪个是最好的(clojuresque)方法来比较Clojure中的字符和字符串。 显然,类似的东西返回false:哪种方法比较字符和字符串的clojuresque最方便? (单个字符串)

(= (first "clojure") "c") 

因为第一回报java.lang.Character中和 “c” 是一个字符串。是否存在一个构造函数来直接比较字符串和字符串而不用调用?我还没有找到与此不同的方式:

(= (str (first "clojure")) "c") 

但我不满意。 任何想法? Bye, Alfredo

回答

42

直向前的String interop怎么样?

(= (.charAt "clojure" 0) \c)

(.startsWith "clojure" "c")

它应该是一样快,它可以得到,并且不分配序列对象(和你的第二个例子中的附加串),它会立即扔掉又正好做一个比较。

+5

我喜欢Clojure的是,它不需要隐藏Java,所以+1。 – ponzao 2010-10-19 19:04:49

0

您可以像使用第二个示例一样使用str。这没有什么不妥。我的意思是,你可以首先打电话给“c”,以使它成为一个角色,但它不会真的有所作为。是否有任何理由为什么你不要这样?通过在角色上调用str,并不会真正增加您的代码。

+0

没有什么特别的原因,我只是想知道如何管理字符和字符串的比较,而不是用我的代码来填充:) – 2010-10-19 17:31:55

22

字符文字是用Clojure写\a \b \c ...所以你可以简单地写

(= (first "clojure") \c) 
+0

好的,但是这只会将问题从字符串到字符..我的意思是,如果我需要输入一个单一的字符串,为了比较这样的字符串,我需要在字符中施放:)但是这是一个很好的提示,我不知道我可以使用\ c表示char。谢谢^^ – 2010-10-19 17:34:09

+0

另请参阅[reader documentation](http://clojure.org/reader)。 – kotarak 2010-10-19 18:45:26

1

你可以从clojure.contrib.string使用TAKE功能。或者编写自己的函数,返回第一个字符,如果这是你经常需要的东西。

6

字符串可以直接编制索引,而不需要从那里构建一个序列并采用该序列的第一个。通过该java代码

(= (nth "clojure" 0) \c) 
=> true 

第n个呼叫:

static public Object nth(Object coll, int n){ 
    if(coll instanceof Indexed) 
     return ((Indexed) coll).nth(n); <------- 
    return nthFrom(Util.ret1(coll, coll = null), n); 
} 

,能有效地直接读取字符。通过该java代码

第一呼叫:

static public Object first(Object x){ 
    if(x instanceof ISeq) 
     return ((ISeq) x).first(); 
    ISeq seq = seq(x); <----- (1) 
    if(seq == null) 
     return null; 
    return seq.first(); <------ (2) 
} 

它建立一个SEQ对字符串(1)(构建SEQ是非常快),然后从该SEQ采取的第一项(2)。返回后seq是垃圾。

Seqs显然访问任何Clojure中的顺序最idomatic的方式,我不敲他们。了解您在创建什么时很有趣。将您拨打first的所有电话转接至nth可能是过早优化的情况。如果你想在字符串中的字符100我会建议使用索引访问功能就像在短第n

:不出汗的小东西:)

2

从根本上(至少在Clojure的水平 - 虽然看到Kotarak's answer和其他替代品),你比较两个序列:“clojure”和“C”。平等的条件是每个序列的第一个元素是相等的。所以,如果你想直接表达这一点,你可以做

(apply = (map first ["clojure" "c"])) 

或周围的其他方式,在其中创建每对字符之间的平等比较懒惰的序列,只是利用它的第一个元素:

(first (map = "clojure" "c")) 
+1

您可以使用'every?'将其扩展为任意前缀(类似于.startsWith):'(every?identity(map =“clojure”“clo”))''。 – kotarak 2010-10-20 05:58:17

0
user=> (= (subs "clojure" 0 1) "c") 
true 
user=> (= (str (first "clojure") "c")) 
true 
0

这些天来,你不一定要使用Java的互操作:

(clojure.string/starts-with? "clojure" "c") 

starts-with?只是一个薄包装(约.startsWith)。

所以,现在如果您同时使用Clojure和ClojureScript,您将不必记住Java和JavaScript互操作。