【问题标题】:Clojure string searching and countingClojure 字符串搜索和计数
【发布时间】:2013-11-19 12:04:44
【问题描述】:

我想知道搜索字符串并返回布尔值(或虚假/真实的东西)的最具 Clojure 风格和标准化的方法是什么。 (例如,在 Java 中,我会使用 .indexOf() 并将其转换为布尔值。)

我要做的是搜索地图中的所有字符串并返回1或0,具体取决于字符串中是否包含“云”一词,然后找出最后的累积值 - 我明白我可以用正则表达式做这个,但是我想知道是否有替代方法?

【问题讨论】:

  • 只是好奇,我们为什么要尝试替代正则表达式?
  • 我很好奇,因为我没有足够的使用它(在我的非 Clojure 工作中)写一些可以很快解决这个基本问题的东西,而且......很好奇

标签: regex clojure


【解决方案1】:

实际上在 Java 中最自然的解决方案是使用contains 方法。你可以在 Clojure 中做同样的事情:

(.contains "foobar" "bar")
;= true

在 seqable 上映射:

(mapv #(.contains "foobar" ^String %) ["foo" "bar"])
;= [true true]

使用地图作为输入,您必须决定是需要键、值还是两者都需要;根据答案,您可能想要使用 keysvals 或仅映射条目(在这种情况下,reduce-kv 会产生比 map 更高效的解决方案)。

这是假设您正在搜索文字子字符串(如indexOf)。使用正则表达式,我会使用 re-find 并转换为 boolean(如果没有匹配,它会返回 nil)。

【讨论】:

  • 谢谢 Michal,我不知道这种方法。 (这会很有用)
  • 我想知道,你能解释一下是什么使它成为方法而不是函数吗?
  • 这些只是不同的概念;方法的概念来自 JVM 端,函数的概念来自 Clojure 端。 containsjava.lang.String 的方法; #(.contains "foobar" ^String %) 是调用此 Java 方法的 Clojure 函数。在底层,Clojure 函数是实现clojure.lang.IFn 接口的对象。
  • ^String 在这里做什么?
  • ^String 用于类型提示,告诉编译器 % 后面的表达式应该是该类型,请参阅clojure.org/java_interop#Java Interop-Type Hints
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 2022-12-06
  • 2017-02-09
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多