newLisp中的Hash排序

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))
dd5
ee1
ff4

transpose后

ddeeff
514

Swap

514
ddeeff
再次进行Transpose

1ee
4ff
5dd

降序排列

5dd
4ff
1ee

这种方法有一定的局限性.

推广:针对通用方法进行推广

(define (comp x y) (>= (x n) (y n)));;n为要排序的元素,索引从0开始
(sort (Mytable) comp) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值