【问题标题】:How to check the equality of strings in clojure without invoking java.lang.String?如何在不调用 java.lang.String 的情况下检查 clojure 中字符串的相等性?
【发布时间】:2010-02-25 21:51:32
【问题描述】:

clojure 中有什么方法可以检查字符串的相等性吗? 即我需要知道它们的内容是否相等,而不是位置。

谢谢。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    Clojure 中的相等性(= 函数)始终测试值,而不是身份,因此如果两个字符串具有相同的内容,则它们是 =

    对于大多数 Java 类型,包括字符串,Clojure = 分派给 Java .equalsString.equals 被定义为“代表相同的字符序列”。

    如果您想测试身份(这些指针是否指向内存中的同一位置?)请使用identical? 函数。

    【讨论】:

    • 我需要比较一个安全令牌,所以我需要一个函数来检查内容是否完全相同并且不接受通配符或正则表达式。你知道clojure的=函数是满足我的需要还是我需要一个更具体的函数?
    • Clojure = 不使用通配符或正则表达式。
    【解决方案2】:
    (= "hello" (str "hel" "lo"))
    ; => true 
    

    JVM 有一个字符串池,每个值最多保存一个条目,因此标识和值相等是相同的比较。有一些方法可以使用StringBuilder.String.,但严格来说这并不正确,但由于clojure 相等函数调用.equals,如果身份不同,将执行值比较。

    【讨论】:

    • (identical? "hello" (str "hel" "lo")) 是假的。 Java 的实习字符串池仅适用于常量字符串。所以(identical? "hello" "hello") 是真的,但是一旦你计算出一些字符串,它就不会与其他任何字符串相等。您可以使用(identical? "hello" (.intern (str "hel" "lo"))) (true) 强制在池中查找/存储
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2011-10-29
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2012-07-21
    • 2017-05-29
    相关资源
    最近更新 更多