Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary clojure中的映射产生意外结果_Dictionary_Clojure - Fatal编程技术网

Dictionary clojure中的映射产生意外结果

Dictionary clojure中的映射产生意外结果,dictionary,clojure,Dictionary,Clojure,在clojure中使用map,检查字符串是否包含大写字符 (map #(= (clojure.string/upper-case %) %) "Hello") 预期结果 (true false false false false) (map #(= (clojure.string/upper-case %) "H) "Hello") (true false false false false) 不幸的是,结果出乎意料 (false f

在clojure中使用map,检查字符串是否包含大写字符

(map #(= (clojure.string/upper-case %) %) "Hello") 
预期结果

(true false false false false)
(map #(= (clojure.string/upper-case %) "H) "Hello") 

(true false false false false)
不幸的是,结果出乎意料

(false false false false false)
(map #(= (clojure.string/upper-case "H") %) "Hello") 

(false false false false false)
当我在第一个“%”中替换“H”时,我做了一个实验,结果仍然出乎意料

(false false false false false)
(map #(= (clojure.string/upper-case "H") %) "Hello") 

(false false false false false)
当我在第二个“%”中替换“H”时,结果发生了变化,这是一个预期结果

(true false false false false)
(map #(= (clojure.string/upper-case %) "H) "Hello") 

(true false false false false)

怎么了?请随意评论。

大写
将字符串转换为所有大写

参考:

您需要使用类似的方法:

 (some #(Character/isUpperCase %) "Hello") => true
 (some #(Character/isUpperCase %) "hello") => nil

不能将字符串与字符进行比较。由字符串组成的序列是字符列表

(seq "Hello")
;; => (\H \e \l \l \o)
(map class "Hello")
;; => (java.lang.Character java.lang.Character java.lang.Character java.lang.Character java.lang.Character)
所以在你的情况下,你的测试归结为

(= "H" \H) ;; => false
这是错误的

要使其正常工作,请尝试以下操作之一:

;; compare strings
(map #(= (clojure.string/upper-case %) (str %)) "Hello")
;; => (true false false false false)

;; compare chars
(map #(= (first (clojure.string/upper-case %)) %) "Hello")
;; => (true false false false false)

这是因为您错误地假设
map
将字符串
“Hello”
分解为
(“H”“e”“l”“l”“o”)
,但事实并非如此

尝试:

所以map将字符串分解为字符列表,而不是单个字符串列表

因此,您的
(map#(=(clojure.string/upper-case%))“Hello”)
正在进行比较
(clojure.string/upper-case\H)
,这会导致
“H”
带有
\H
。 由于一个是单个字符串,而另一个是字符,因此由于类型不同,结果为
false

(map #(= (clojure.string/upper-case %) (str %)) "Hello")
然而,它实现了您对原始代码的期望。 它返回:

(true false false false false)
作用 最有效的方法可能是使用正则表达式:

(defn has-upper-case? [s] (boolean (re-find #"[A-Z]" s)))

不太严格(不返回布尔值,但从左到右返回字符串的第一个上部单个字符串或
nil
(如果找不到):


正如其他人指出的,将字符与字符串进行比较是行不通的。比较字符串将起作用:

(map#(=(clojure.string/upper-case%)(str%))“你好”)
=>(真假假假)
然而,这更直接:

(map#(Character/isUpperCase%)“Hello”)
=>(真假假假)

您被
clojure.string/upper-case的未记录行为抓住了:

  • 它适用于任何对象,而不仅仅是字符串
  • 它总是返回一个字符串
那么比如说,

(clojure.string/upper-case +)
=> "CLOJURE.CORE$_PLUS_@19CFE007"
如果查看,您会发现它在
.toUpperCase
之前应用了
.toString

所以它也适用于单个字符。但它返回的是一个字符串,而不是我所期望的字符:

(clojure.string/upper-case 1)
=> "1"
(#(map = (clojure.string/upper-case %) %) "Hello")
=> (true false false false false)
补救方法是将
大写
作为一个整体应用于字符串,然后使用
映射
=
逐字符比较原始字符串和转换后的字符串:

(clojure.string/upper-case 1)
=> "1"
(#(map = (clojure.string/upper-case %) %) "Hello")
=> (true false false false false)
或者,使用
(fn[…])
而不是
#(…)


你说你需要检查一个字符串是否包含大写字符,那么我假设你不需要知道是哪一个,对吗?在这种情况下,为什么不检查整个字符串
(=(str/小写字母“Hello”)“Hello”)
应该告诉您字符串的初始值是否为小写。这是程序的一小部分,出于某些原因,我需要逐个字符检查长字符串。将字符串与字符进行比较,您的测试实际上如下所示:
(=“H”\H)
这是错误的。下面有一些很好的答案。您可能还对
tupelo.chars
()和
tupelo.string
()中的helper和便利函数感兴趣,而不是(如果条件为true false),您可以直接将该条件用作truthy/falsey值,或者,如果确实需要布尔结果,则将其包装为:(布尔条件)--这将返回完全正确或错误的结果。@SeanCorfield,我在哪里可以找到您建议的示例?请注意您的评论,我直接使用字符或零值,而不是“if”语句。(map#(re find#“[A-Z]”(str%))“您好”),谢谢您的帮助,@madeinquint-True,我只是想遵循一个惯例,
函数实际上必须返回布尔值-不是吗
(if(re find#“[A-Z]”“Hello”)true-false)
将返回
true
false
,而如果没有
if
clouse,它将返回
“H”
(所以有些字符串)或
nil
@madeinquint使用正则表达式的目的是使
映射
多余<代码>重新查找
在看到字符串中的第一个大写字符时立即停止扫描。然后不再检查其他字符->从而提高性能。因此,在使用正则表达式时,您可以一次输入整个字符串,扫描将在找到第一个匹配项后立即结束。感谢您的帮助,将您的注释与正则表达式结合起来。我找到了答案。谢谢你的评论,你的回答帮助我澄清了Clojure中数据结构的一些概念。谢谢你的评论。我可以问个问题吗?为什么要在map前面应用set“#”操作符,并在map后面进行比较“=”?@madeinquint
#(…)
是一种用于编写小函数的简写方法。您在问题的第一行代码中自己使用了它。我将更改答案,改为使用
fn
。@在
映射将原始字符串与转换后的字符串逐个字符进行比较后,输入
=
=
后面跟着两个集合,因此作为两个参数的函数调用。例如,
(map+[1 2 3][4 5 6])
产生
(5 7 9)