Sets是一組不重複值
的集合,
例如本期樂透號碼就很適合用Set存放,因為數字不可能重複:
Javascript | Clojurescript |
---|---|
new Set(22, 4, 16, 8, 10, 2) | #{22 4 16 8 10 2} |
set
& conj
set好用的地方之一,把Vector裡的值轉成Sets也順便處理重複資料,乾淨溜溜~
=> (set ["h" "a" "p" "p" "y" "b" "i" "r" "t" "h" "d" "a" "y"])
#{"d" "p" "a" "t" "i" "b" "r" "y" "h"}
把keyword加進set裡,用conj也順便處理重複資料
例如I love you裡~
=> (conj #{:i :l :o :v :e } :y :o :u)
#{:y :v :o :e :l :i :u}
重複的o
和v
就被移除囉
tutorial.core=> (set [8 8 2 5 2 5 2])
#{2 5 8}
tutorial.core=> (set '(8 8 2 5 2 5 2))
#{2 5 8}
注意:List前面一定要有'
的符號,然會壞掉
出現了ClassCastException
'(8 8 2 5 2 5 2)
意思是把lists存起來,回傳原本的list
tutorial.core=> (set (8 8 2 5 2 5 2))
Execution error (ClassCastException) at tutorial.core/eval2085 (form-init2678990013733270315.clj:1).
class java.lang.Long cannot be cast to class clojure.lang.IFn (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'app')
clojure大大指點:
沒有 quote 的 expression 之所以噴錯,問題出於 list 的獨特的 interpretation
有空要來好好探究一下原因
hash-set
來設定Setset裡面也可以放不同的data structure們來大亂鬥,
例如之前學過的 string
, keywords
(hash-set :hello "你好嗎" "衷心感謝" "期待再相逢" )
=> #{"期待再相逢" :hello "衷心感謝" "你好嗎"}
或是更簡便的方式:直接把elements寫在#{}
裡面
#{:hello "你好" :Iam 18 "years olds"}
=> #{"你好" :Iam :hello "years olds" 18}
補充:
hash-set 除了是 Clojure 的四大 data structure 之一,它也是一個 function,也是可以「呼叫」的。
但return順序好像有點亂掉XD
既然說到了順序,
就來看看collections API
試試API上的sorted-set會產生什麼樣的效果
sorted-set
把剛剛的你好我今年18歲
例子丟給 sorted-set
後發現會throw error
(sorted-set :hello "你好" :Iam 18 "years olds")
Execution error (ClassCastException) at java.lang.String/compareTo (String.java:134).
class clojure.lang.Keyword cannot be cast to class java.lang.String (clojure.lang.Keyword is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap')
原因是 unable to implement java.lang.String.compareTo
compare不能比較不同的type。
如果全部改為keywords
就可以執行。
(sorted-set :hello :你好 :Iam :18 :years :olds)
=> #{:18 :Iam :hello :olds :years :你好}
如果真的要比較的話,可以使用sorted-map
,但要在不同型態的元素前面加上keyword
sorted-map
參考https://clojure.org/guides/comparators,
稍稍改一下例子,讓執行結果可以按照keyword的alphabetical排序
(sorted-map :hello :你好嗎 :thanks 9527 :see-you "期待再相逢" )
=> {:hello :你好嗎, :see-you "期待再相逢", :thanks 9527}
今天看了兩個ClassCastException的Execution error
,在做collection轉換時偶爾也會遇到一些error,這時候靜下心來讀error的提示,並且注意回去對照API文件上的使用說明,通常都可以成功排除問題。
更多collections API小抄可以看這裡!
記下可能需要了解,但還未涵蓋在本文內容的項目:
set
(把任何其他 collection 轉換成為目標collection type)有別於hash-set
,就像之後預計在Day09提的vec
有別於vector
。hash-set
接受多個parameters的collection constructorhash-set
除了是 Clojure系列文提到的四大data structure之一,它也是一個function,在實務上非常方便。Reference: