免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5496 | 回复: 17
打印 上一主题 下一主题

请教个hash key排序问题 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-02 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-17 11:03 |只看该作者 |倒序浏览
有一个hash:
1A2=>0.1,
1A3=>0.5,
1A10=>0.4,
1A8=>0.7,
2B1=>0.4,
2B3=>0.2,
2B10=>0.4,
2B7=>0.1,
我想按照key排序,sort{$a<=>$b}之后输出结果:
1A10=>0.4,
1A2=>0.1,
1A3=>0.5,
1A8=>0.7,
2B10=>0.4,
2B1=>0.4,
2B3=>0.2,
2B7=>0.1,
我希望得到的结果是:
1A2=>0.1,
1A3=>0.5,
1A8=>0.7,
1A10=>0.4,
2B1=>0.4,
2B3=>0.2,
2B7=>0.1,
2B10=>0.4,
请问该如何实现?谢谢啦。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2012-09-17 11:16 |只看该作者
你这既不是字符串排序也不是数字排序,自己写个比较函数来排吧。只要你能描述清楚怎么做,写代码从来都是很简单的事情

论坛徽章:
0
3 [报告]
发表于 2012-09-17 11:17 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash = (
  5.     '1A2'=>0.1,
  6.     '1A3'=>0.5,
  7.     '1A10'=>0.4,
  8.     '1A8'=>0.7,
  9.     '2B1'=>0.4,
  10.     '2B3'=>0.2,
  11.     '2B10'=>0.4,
  12.     '2B7'=>0.1,
  13. );

  14. foreach my $k (
  15.     map { $_->[0] }
  16.    sort { $a->[1] <=> $b->[1]
  17.        or $a->[2] cmp $b->[2]
  18.        or $a->[3] <=> $b->[3] }
  19.     map { [ $_, split(/([A-Z])/,$_) ] }
  20.     keys %hash
  21. ){
  22.     print "$k => $hash{$k}\n";
  23. }
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-02 06:20:00
4 [报告]
发表于 2012-09-17 11:22 |只看该作者
回复 3# kk861123
十分感谢!

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2012-09-17 12:37 |只看该作者
本帖最后由 jason680 于 2012-09-17 12:39 编辑

回复 3# kk861123

There is sort common way for word and number in the same string.

#!/usr/bin/perl
use strict;
use warnings;

my %hash = (
    '1A2a02'=>0.122,
    '1A02b1'=>0.121,
    '1A02a1'=>0.121,
    '1A20a3'=>0.1203,
    '1A21a3'=>0.1213,
    '1A2a1'=>0.121,
    '1Aa2a1'=>0.121,
    '1A3'=>0.5,
    '1A10'=>0.4,
    '1A8'=>0.7,
    '2B1a'=>0.41,
    '2B1'=>0.4,
    '2B3'=>0.2,
    '2B10'=>0.4,
    '2B7'=>0.1,
);

foreach my $k (
    map { $_->[0] }
   sort { $a->[1] cmp $b->[1] }
    map { (my $nwn=$_)=~s/(\d+)/sprintf("%05d",$1)/ge; [$_, $nwn] }
    keys %hash
){
    print "$k => $hash{$k}\n";
}


   

论坛徽章:
0
6 [报告]
发表于 2012-09-17 12:50 |只看该作者
回复 5# jason680


    COOL! thanks~

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
7 [报告]
发表于 2012-09-17 14:19 |只看该作者
jason680 发表于 2012-09-17 08:37
回复 3# kk861123

There is sort common way for word and number in the same string.

谢谢啦。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
8 [报告]
发表于 2012-09-17 14:27 |只看该作者
刚去 cpan 搜到个 Sort::Naturally 模块

论坛徽章:
0
9 [报告]
发表于 2012-09-17 15:22 |只看该作者
施瓦茨转换排序

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
10 [报告]
发表于 2012-09-19 10:14 |只看该作者
jason680 发表于 2012-09-17 08:37

回复 3# kk861123

There is sort common way for word and number in the same string.
  1. map { (my $nwn=$_)=~s/(\d+)/sprintf("%05d",$1)/ge; [$_, $nwn] }
复制代码


That's one small code for a man, one giant leap for mankind.


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP