免费注册 查看新帖 |

Chinaunix

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

请教个哈希/数组的排序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-10 16:05 |只看该作者 |倒序浏览
本帖最后由 xiaoyezi2004 于 2016-08-10 16:04 编辑

请教各位大侠,我有如下算法要求如下:要求用Perl实现;
假设我有如下数据结构(目前我用哈希实现):
my %hash = {
     'CSH' =>{
                  '3' => {
                           'px' => 20,
                           'dt' => '20161221'
                          },
                   '4' => {
                            'px' =>10,
                            'dt' => '20161221'
                          }
                                   }
        'OTH' =>{
                  '1' => {
                           'px' => 30,
                           'dt' => '20161221'
                          },
                   '2' => {
                            'px' => 40,
                            'dt' => '20171221'
                          }
                                   }
            'ABC' =>{
                  '2' => {
                            'px' => 10,
                           'dt' => '20191221'
                          },
                   '3' => {
                            'px' => 25,
                            'dt' => '20201221'
                          }
                                   }
                                  
        };

(1)先按照dt值排序,取所有里边最小的:
(2)如果最小的有多个,从最小的这些里边取第一级key是CSH的, 如果CSH存在,并且多个,那取CSH下最小的那个key对应value;如果CSH不存在,就取所有的里边二级哈希的key最小的那个对应的value;

my %hash = {
     'CSH' =>{
                  '3' => {
                           'px' => 20,
                           'dt' => '20161221'
                          },

                   '4' => {
                            'px' =>10,
                            'dt' => '20161221'
                          }
                                   }
         'OTH' =>{
                  '1' => {
                           'px' => 30,
                           'dt' => '20161221'
                          },
                   '2' => {
                            'px' => 40,
                            'dt' => '20171221'
                          }
                                   }
            'ABC' =>{
                  '2' => {
                            'px' => 10,
                           'dt' => '20191221'
                          },
                   '3' => {
                            'px' => 25,
                            'dt' => '20201221'
                          }
                         }
                                  
        };
我最后想得到 'px'  = 20,   'dt' = '20161221'

如果哈希如下:
my %hash = {

           'OTH' =>{
                   '1' => {
                          'px' => 30,
                           'dt' => '20161221'

                          },
                   '2' => {
                            'px' => 40,
                            'dt' => '20171221'
                          }
                                   }
            'ABC' =>{
                    '2' => {
                            'px' => 10,
                           'dt' => '20191221'
                          },
                   '3' => {
                            'px' => 25,
                            'dt' => '20201221'
                          }
                                   }
                                  
        };
如上例我想得到px =30, dt=20161221
请问怎么实现? 或者这个例子我们选用数组比较合适,如果是数组请问怎么实现?多谢各位!

论坛徽章:
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
2 [报告]
发表于 2016-08-10 17:06 |只看该作者
是排序还是取(第一个)最小值??

1. 排序
  请说明清楚及排序结果...

2. 取最小值
  建构中,就可(保存)取出...

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
3 [报告]
发表于 2016-08-10 20:19 |只看该作者
%hash这个变量有毒,目测有语法错误。

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
4 [报告]
发表于 2016-08-11 00:10 |只看该作者
$hash1 = {
  'CSH' =>{
          '3' => {
            'px' => 20,
            'dt' => '20161221'
          },
          '4' => {
            'px' =>10,
            'dt' => '20161221'
          }
  },
  'OTH' =>{
          '1' => {
            'px' => 30,
            'dt' => '20161221'
          },
          '2' => {
            'px' => 40,
            'dt' => '20171221'
          }
  },
  'ABC' =>{
          '2' => {
            'px' => 10,
            'dt' => '20191221'
          },
          '3' => {
            'px' => 25,
            'dt' => '20201221'
          }
  }
  
};
$hash2 = {
  
  'OTH' =>{
          '1' => {
            'px' => 30,
            'dt' => '20161221'
          },
          '2' => {
            'px' => 40,
            'dt' => '20171221'
          }
  },
  'ABC' =>{
          '2' => {
            'px' => 10,
            'dt' => '20191221'
          },
          '3' => {
            'px' => 25,
            'dt' => '20201221'
          }
  }
  
};

sub SortMyHash
{
  my $A = $_[0];
  my @List;
  for $k1 (keys %$A)
  {
          $Key1 = ($k1 eq 'CSH') ? 0 : 1;
          for $k2 (keys %{$A->{$k1}})
          {
            $Key2 = $k2;
            
            $Key3 = $A->{$k1}->{$k2}->{dt};
            $Value = sprintf 'px=%d, dt=%d', $A->{$k1}->{$k2}->{px}, $A->{$k1}->{$k2}->{dt};
            push @List, "$Key3-$Key1-$Key2:$Value";
          }
  }
  my @R = sort @List;
  # local $,="\n"; print @R;# see the sorted array
  return $R[0] =~ s/.+://r;
}


printf "%s\n", SortMyHash $hash1;
printf "%s\n", SortMyHash $hash2;

$>  perl aaa.pl
px=20, dt=20161221
px=30, dt=20161221

论坛徽章:
0
5 [报告]
发表于 2016-08-11 14:37 |只看该作者
非常感谢, 太漂亮啦! 回复 4# RE_HASH


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP