newlisp中可以利用Hash functions 来实现某些特定数据出现次数的统计,如
(new Tree 'MyHash)
(if (Myhash y)
(Myhash y (+ (Myhash y) 1))
(Myhash y 1)
)
统计完成后如何根据数据出现的次数进行排序呢? newlisp中没有实现根据value值进行排序的封装方法,因此也需要一些额外的操作来实现。
(Mytable "dd" 5)
(Mytable "ff" 4)
(Mytable "ee" 1)
(Mytable "ff")
< 4
(Mytable)
< ((“dd” 5)(“ee” 1)(“ff” 4))
由上操作可以看出,newlisp中Hash的存储是以二层列表的模式进行存储,同时默认对key进行升序排列。下面则根据value值进行排序:
第一种(通用类型)
(define (comp x y )(>= (last x) (last y)))
(sort (Mytable) comp)
< (("dd" 5 )("ff" 4)("ee" 1))
第二种,由于刚开始学学习newlisp不是很熟练,采用了包含行列式变换在内的操作处理后进行排序。
(set 'l (Mytable))
(set 'middle-var (transpose l)) ;;进行transpose换位
(swap (middle-var 0) (middle-var 1)) ;;交换middle-var的两个元素
(set 'sort-list (sort (transpose middle-var) >));;再次进行transpose换位,最后进行降序排列。
图解:
(Mytable) -->((“dd” 5)(“ee” 1)(“ff”4))
dd | 5 |
ee | 1 |
ff | 4 |
transpose后
dd | ee | ff |
5 | 1 | 4 |
Swap
5 | 1 | 4 |
dd | ee | ff |
1 | ee |
4 | ff |
5 | dd |
降序排列
5 | dd |
4 | ff |
1 | ee |
这种方法有一定的局限性.
推广:针对通用方法进行推广
(define (comp x y) (>= (x n) (y n)));;n为要排序的元素,索引从0开始
(sort (Mytable) comp)