免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 104359176
打印 上一主题 下一主题

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

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
11 [报告]
发表于 2015-04-28 13:01 |只看该作者
本帖最后由 104359176 于 2015-04-28 13:04 编辑

回复 10# zhlong8


    这个代码可以处理嵌套结构,用的是递归,每次处理两层。
  1. use v6;

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

  3. say sort-list(@array).perl;

  4. #=> Array.new([1, "a"], [2, "b"], [[3, "d"], [[4, "e"], [5, "c"]]])

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

论坛徽章:
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
12 [报告]
发表于 2015-04-28 14:47 |只看该作者
回复 11# 104359176


    把3改成6呢?又或没有 [3,'d'] 这一项,直接两层数组 [ [ [ 5, 'c'], [4 , 'e'] ] ] 呢?

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
13 [报告]
发表于 2015-04-28 18:47 |只看该作者
把 3 改成 6:
  1. Array.new([1, "a"], [2, "b"], [[[4, "e"], [5, "c"]], [6, "d"]])
复制代码
取消 3 这项,就出现了问题:
  1. Array.new([1, "a"], [2, "b"], [[[5, "c"], [4, "e"]]])
复制代码

论坛徽章:
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
14 [报告]
发表于 2015-04-28 23:02 |只看该作者
回复 13# 104359176


    第一条结果正确很出乎意料,不会查 Perl6 的文档于是试验了下 sort 1, [0], 3, [4] 竟然能返回 [0], 1, 3, [4],但里面有两条数据比如 [4,-10] 也只会取第一项4来排序。也就是说数组同数字比较,空数组相当于0, 否则取数组第一个元素同数字比较(这句话里包含了递归,如[[[2]]] > 0)。

    第二条结果错误/不合预期是因为只有一个元素的数组自然是不需要排序的,实际上排序时比较的key是 1  [5,'c']  2,  因为 [5, 'c'] > 2 所以出现你贴出的结果。

    我不停给你提问是因为我觉得你根本还没理解你自己提的这个问题,你能写出正确处理任意嵌套的代码吗?

论坛徽章:
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
15 [报告]
发表于 2015-04-29 08:29 |只看该作者
回复 14# zhlong8

>> ...你根本还没理解你自己提的这个问题,...

在CU中这是"正常"的
提问者反而不知自已"真正"的问题

一直都不懂这样的sort排序 要做什么
   

论坛徽章:
10
2015年亚洲杯之科威特
日期:2015-04-13 13:51:5315-16赛季CBA联赛之山东
日期:2016-01-16 18:35:0815-16赛季CBA联赛之广东
日期:2016-01-04 15:26:23程序设计版块每日发帖之星
日期:2015-11-13 06:20:002015亚冠之阿尔艾因
日期:2015-11-10 12:32:242015亚冠之阿尔沙巴布
日期:2015-05-15 18:26:49羊年新春福章
日期:2015-04-28 16:45:112015年亚洲杯之伊拉克
日期:2015-04-25 20:06:30羊年新春福章
日期:2015-04-13 13:53:2015-16赛季CBA联赛之八一
日期:2016-01-20 18:23:49
16 [报告]
发表于 2015-04-29 08:36 |只看该作者
   看看精彩的代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
17 [报告]
发表于 2015-04-29 14:45 |只看该作者
是我没说清楚,这个问题的原型并不是单纯探讨一种算法,而是从解析 Perl 6 的 Grammar 中的 Match 的数据结构衍生出来的。所以没有考虑跨层嵌套的可能性。

至于这种 sort 办法,也不是从官方文档看看到的,是从 Rakudo 的源代码中看到的,后来从其他文档得到了证实。
  1. #!perl6

  2. my $str = q< say'hello' if True >;

  3. grammar my-grammar {
  4.   rule  TOP { ^ <exp> <if-exp> $ }
  5.   token String { <.single-quote> <-[\']>+ <.single-quote> }
  6.   token Op { say || print || sort || printf }
  7.   token If  { unless || if || while }
  8.   token bool { 'True' || 'False' }
  9.   token single-quote { "'" }
  10.   rule  exp { <Op> <String> }
  11.   rule  if-exp  { <If> <bool> }
  12. }

  13. my $match = my-grammar.parse($str);
  14. my $ast = get-match-ast($match);
  15. # say $ast.perl;
  16. say ast-lisp($ast);

  17. sub get-match-ast($match) {
  18.   if is-blank-match($match) {
  19.     return [ $match.from, $match.Str ];
  20.   }
  21.   my @ast;
  22.   for $match.kv -> $key, $value {
  23.     given $value {
  24.       when Array {
  25.         for $value.values -> $sub-value {
  26.           push @ast, get-match-ast($sub-value);
  27.         }
  28.       }
  29.       when Match { push @ast, get-match-ast($value); }
  30.       default { say 'Unknown type of Match hash value'; exit }
  31.     }
  32.   }
  33.   return [ sort-match-ast(@ast) ];
  34. }

  35. sub sort-match-ast(@ast) {
  36.   @ast.sort: -> $value {
  37.     $value[0] ~~ Int ?? $value[0] !! $value.[0][0];
  38.   }
  39. }

  40. sub is-blank-match($match) {
  41.   if is-blank-list($match) {
  42.     if is-blank-hash($match) {
  43.       return True;
  44.     }
  45.   }
  46.   return False;
  47. }

  48. sub is-blank-list($match) {
  49.   $match.list.perl eq '().list' ?? True !! False;
  50. }

  51. sub is-blank-hash($match) {
  52.   my $blank-hash = 'EnumMap.new()'|'EnumMap.new("" => [])';
  53.   $match.hash.perl eq $blank-hash ?? True !! False;
  54. }

  55. sub ast-lisp($ast) {
  56.   return $ast[1] if $ast[0] ~~ Int;
  57.   my @map-ast;
  58.   for $ast.values -> $value {
  59.     push @map-ast, ast-lisp($value);
  60.   }
  61.   my $lisp = join ' ', @map-ast;
  62.   return '(' ~ $lisp ~ ')';
  63. }

  64. # vim: ft=perl6
复制代码
output:
  1. ((say 'hello') (if True))
复制代码

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-26 06:20:00
18 [报告]
发表于 2015-04-29 15:30 |只看该作者
我收藏你。。。。

论坛徽章:
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
19 [报告]
发表于 2015-04-29 22:49 |只看该作者
本帖最后由 rubyish 于 2015-04-29 18:53 编辑

youyisi
yinyuemi de zhege code youyisi:
  1. sub f {
  2.     my $f = shift;
  3.     ref( $f->[0] ) eq "ARRAY"
  4.       ? f( @$f = sort { f($a) <=> f($b) } @$f )
  5.       : $f->[0];
  6. }

复制代码
  1. my @array = (
  2.     [ 1, 'a' ],
  3.     [ [ 14, 'n' ], [ 15, 'o' ] ],
  4.     [
  5.         [
  6.             [ [ [ [ 13, 'm' ], [ 12, 'l' ] ], [ 11, 'k' ] ], [ 10, 'j' ] ],
  7.             [ 9, 'i' ]
  8.         ],
  9.         [ 7, 'g' ],
  10.         [ 8, 'h' ]
  11.     ],
  12.     [ [ [ 6, 'f' ], [ 5, 'e' ] ], [ [ 4, 'd' ], [ 3, 'c' ] ] ],
  13.     [ 2, 'b' ],
  14. );
复制代码
  1. [ [ 1, a ], [ 2, b ], [ [ [ 3, c ], [ 4, d ] ], [ [ 5, e ], [ 6, f ] ] ], [ [ 7, g ], [ 8, h ], [ [ 9, i ], [ [ 10, j ], [ [ 11, k ], [ [ 12, l ], [ 13, m ] ] ] ] ] ], [ [ 14, n ], [ 15, o ] ] ]
复制代码
zhege paixu, wo pai le 2 tien, cai pai chu zhengquede jieguo.
dan yu yinyuemi de code shizai xiangcha taiyuan le.

论坛徽章:
0
20 [报告]
发表于 2015-05-05 08:56 |只看该作者
回复 19# rubyish


    拼音看起来真心累,比看代码累啊...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP