免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3753 | 回复: 19

嵌套数据结构的排序 [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2015-04-27 11:01 |显示全部楼层
本帖最后由 104359176 于 2015-04-27 21:03 编辑

前段时间用 Perl 6 处理了一个排序的问题,如果用 Perl 5 的话不知道能否能这么简单:

一个嵌套的关联数组,按照 first 元素进行排序:
  1. use v6;

  2. my @array = ([1,'a'], [[4,'d'], [3,'c']], [2, 'b']);

  3. say sort-list @array;

  4. #=> ([1,'a'], [2, 'b'], [[3,'d'], [4,'c']])

  5. sub sort-list( @list ) {
  6.     @list = @list.sort: -> $pair {
  7.         $pair[0] ~~ Int ?? $pair[0] !! sort-list(@$pair).[0][0];
  8.     }
  9. }
复制代码

论坛徽章:
0
发表于 2015-04-27 14:35 |显示全部楼层
这么简单。

学习了。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2015-04-27 15:24 |显示全部楼层
回复 1# 104359176

  1. perl -MData::Dumper -le 'use strict;
  2. my @array = ([1,"a"], [[8,"c"], [6,"d"],[[3,"a"],[1,"c"]]], [2, "b"]);
  3. sub f{my $f=shift; ref($f->[0]) eq "ARRAY" ? f(@$f=sort{f($a)<=>f($b)}@$f) : $f->[0]};
  4. print Dumper [sort {f($a) <=> f($b)}@array]'

复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2015-04-27 20:45 |显示全部楼层
回复 3# yinyuemi


    不错,结果正确。功力深厚啊

论坛徽章:
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
发表于 2015-04-28 04:40 |显示全部楼层
本帖最后由 rubyish 于 2015-04-29 18:37 编辑

yixia code shi cuowude

perl5, xiefa leisi ~
  1. sub sort_list(\@) {
  2.     my $list = shift;
  3.     @$list = Sort {
  4.         my $pair = $_;
  5.         ref $pair->[0] ? ( &sort_list($pair) )[0][0] : $pair->[0];
  6.     } @$list;
  7. }

  8. my @array = ( [ 1, 'a' ], [ [ 4, 'd' ], [ 3, 'c' ] ], [ 2, 'b' ] );
  9. Say sort_list @array;
复制代码
output:
  1. 1 a 2 b 3 c 4 d
复制代码
sub Say, Sort:
  1. sub Say { say "@{[sub{map ref$_?__SUB__->(@$_):$_,@_}->(@_)]}" }

  2. sub Sort(&@) {
  3.     my $B = shift;
  4.     map $_->[0], sort { $a->[1] <=> $b->[1] } map [ $_, &$B ], @_;
  5. }
复制代码

论坛徽章:
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
发表于 2015-04-28 06:06 |显示全部楼层
ru
  1. my @array =
  2.   ( [ 1, 'a' ], [ [ 4, 'd' ], [ [ 3, 'c' ], [ 5, 'e' ] ] ], [ 2, 'b' ] );
复制代码
nayige huishi qiwangde jieguo?

  1. [ [ 1, a ], [ 2, b ], [ [ [ 3, c ], [ 5, e ] ], [ 4, d ] ] ]
  2. [ [ 1, a ], [ 2, b ], [ 3, c ], [ 4, d ], [ 5, e ] ]
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2015-04-28 08:03 |显示全部楼层
回复 6# rubyish


    第一个,数据结构不能被**。只是位置发生变化。

论坛徽章:
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
发表于 2015-04-28 09:03 |显示全部楼层
怎么中间还改贴子了,我记得函数是叫 sort_nest_array 而且没用递归的。贴出来的代码都要先运行检查一下啊

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2015-04-28 09:07 |显示全部楼层
回复 8# zhlong8

那个版本运行过,结果有一些问题。

   

论坛徽章:
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
发表于 2015-04-28 09:21 |显示全部楼层
回复 9# 104359176


    我明白,如果一开始的代码正确 Perl6 就小聪明的有点过了。不过你现在的代码也还是错误的, .[0][0] 那里,如果嵌再多一层怎么办?既然递归就不能限定只能两层
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP