[随笔] Scala trunk新加入的几个排列组合相关的方法

Eastsun 2011-01-26
1. SeqLike#permutations: Iterator[This]
2. SeqLike#combinations(n: Int): Iterator[This]
3. SetLike#subsets(n: Int): Iterator[This] & SetLike#subsets: Iterator[This]


这几个方法目前都是我实现的,其用处从方法名就可以看出。这里需要注意的几点
a. permutations与combinations都允许Seq中有重复元素,并且能得到正确的结果。
b. permutations与combinations对Seq中元素的类型没有任何要求(特别地:不需要是Oredered的子类型),并且返回的Iterator在某种意义上按“字典顺序”排列(特别的,如果Seq中的元素已经是有序的【正序或逆序】,那么得到的Iterator一定是字典排序的【正序或逆序】)。
c. 虽然对于大部分Set来说,不能保证里面的元素是有顺序的;但SetLike#subsets返回的Iterator在某种意义上也是按照“字典顺序”排列的。
d. 目前“字典排序”这个特点并没有写到scala docs中去。不过我觉得是非常有用的,以后我会向extempore建议加进去。


下面举两个例子说明:
引用
scala> "ababc".permutations foreach println
aabbc
aabcb
aacbb
ababc
abacb
abbac
abbca
abcab
abcba
acabb
acbab
acbba
baabc
baacb
babac
babca
bacab
bacba
bbaac
bbaca
bbcaa
bcaab
bcaba
bcbaa
caabb
cabab
cabba
cbaab
cbaba
cbbaa

scala> val set = collection.immutable.SortedSet(1,2,3,4)
set: scala.collection.immutable.SortedSet[Int] = TreeSet(1, 2, 3, 4)

scala> set.subsets foreach println
TreeSet()
TreeSet(1)
TreeSet(2)
TreeSet(3)
TreeSet(4)
TreeSet(1, 2)
TreeSet(1, 3)
TreeSet(1, 4)
TreeSet(2, 3)
TreeSet(2, 4)
TreeSet(3, 4)
TreeSet(1, 2, 3)
TreeSet(1, 2, 4)
TreeSet(1, 3, 4)
TreeSet(2, 3, 4)
TreeSet(1, 2, 3, 4)

scala> "ababc".combinations(2) foreach println
aa
ab
ac
bb
bc
messi_18 2011-03-03
scala 2.9什么时候能出?那时候stm是不是就加进去了?
Eastsun 2011-03-06
应该快了,本来很早之前Scala Team就准备发布Scala 2.9的RC版了,但反对的声音很多,就不了了之。
不过从Scala2.8以来,因为改动太大,一直不是太稳定,每个版本都有一些小变换。估计要等到Scala3.0才会稳定下来。
另外Scala IO也出0.1了,但我怀疑Scala IO的作者是不是名气不过,关注的人非常少。
Global site tag (gtag.js) - Google Analytics