加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中的自定义数组排序

发布时间:2020-12-15 22:00:31 所属栏目:大数据 来源:网络整理
导读:我有一组perl do-do任务看起来像这样: @todos = ( "1 (A) Complete online final @evm4700 t:2010-06-02","3 Write thank-you t:2010-06-10","4 (B) Clean t:2010-05-30","5 Donate to LSF t:2010-06-02","6 (A) t:2010-05-30 Pick up dry cleaning","2 (C)
我有一组perl do-do任务看起来像这样:
@todos = (
  "1 (A) Complete online final @evm4700 t:2010-06-02","3 Write thank-you t:2010-06-10","4 (B) Clean t:2010-05-30","5 Donate to LSF t:2010-06-02","6 (A) t:2010-05-30 Pick up dry cleaning","2 (C) Call Chris Johnson t:2010-06-01"
);

第一个数字是任务的ID.如果任务旁边有([A-Z]),则定义任务的优先级.我想要做的是以一种将优先级项放在第一位的方式对任务数组进行排序(按优先顺序递减,从A-Z开始):

@todos = (
  "1 (A) Complete online final @evm4700 t:2010-06-02","2 (C) Call Chris Johnson t:2010-06-01"
  "3 Write thank-you t:2010-06-10",);

我不能使用常规sort()因为任务旁边的ID,所以我假设需要某种自定义排序子程序.但是,我对如何在perl中高效地完成此任务的知识很少.

谢谢,所有.

解决方法

听起来你想要 Schwartzian transform:
@todos =
    map  { $_->[0] }
    sort { $a->[1] cmp $b->[1] or $a->[0] cmp $b->[0] }
    map  { [ $_,/^d+ (([[:alpha:]]))/ ? $1 : "[" ] }
    @todos;

“[”是“Z”后的字符;将这个“优先级”赋予其他未优先级的项目将在优先级项目之后对它们进行排序.

或者,也许更容易掌握:

@todos =
    map { substr $_,1 }
    sort
    map { (/^d+ (([[:alpha:]]))/ ? $1 : "[") . $_ }
    @todos;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读