免费注册 查看新帖 |

Chinaunix

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

hash 相同的key,将 values相加 [复制链接]

论坛徽章:
0
发表于 2012-10-24 16:40 |显示全部楼层
%some_hash =
  ( "a", 1, "b", 2,"c", 3,  "a",4 );
print $some_hash{"a"};

这样打印出来的是"a"最后一个values:4,如果要打印出5,也就是"a"的两个值相加,有什么简单点的写法吗?谢谢。

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
发表于 2012-10-24 17:03 |显示全部楼层
LZ应该知道什么是hash的key吧

论坛徽章:
0
发表于 2012-10-24 17:07 |显示全部楼层
知道啦。。我在解析一个文件的时候,把它搞成hash后,发现居然有key相同,所以要想办法把对应的值加起来。遍历一次当然可以处理,不过我觉得太麻烦了点。有没简单的方法呢?下面是遍历的:

%some_hash = ( "a", 1, "b", 2, "c", 3, "a", 4 );
while ( ( my $key, my $values ) = each %some_hash ) {
        if ($key=~/^a$/){
                $v=$values;
                $v++;
        }
}
print $v;

论坛徽章:
0
发表于 2012-10-24 17:31 |显示全部楼层
文件至少要遍历一次嘛~不然处理啥呀~

论坛徽章:
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
发表于 2012-10-24 18:15 |显示全部楼层
回复 3# kejiake

$ cat same_key_sum.pl
use strict;
use warnings;

my %hData;
while(<DATA>){
  chomp;
  my ($sKey, $sValue) = split;
  $hData{$sKey} = exists $hData{$sKey} ?
                  $hData{$sKey} + $sValue :
                  $sValue;
  #if(exists $hData{$sKey}){
  #  $hData{$sKey} += $sValue;
  #}
  #else{
  #  $hData{$sKey} = $sValue;
  #}
}
foreach (sort keys %hData){
  print "key=$_, value=$hData{$_}\n";
}
__DATA__
a 1
b 2
c 3
a 4

$ perl same_key_sum.pl
key=a, value=5
key=b, value=2
key=c, value=3

   

论坛徽章:
0
发表于 2012-10-24 19:40 |显示全部楼层
回复 3# kejiake


    一旦搞成了hash,就不存在重复的键了啊

论坛徽章:
0
发表于 2012-10-24 20:13 |显示全部楼层
我也很好奇,lz是怎么构造出一个存在多个相同key的hash的。

论坛徽章:
0
发表于 2012-10-25 08:54 |显示全部楼层
供参考
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my @array = ( "a", 1, "b", 2, "c", 3, "a", 4 );
  6. my %hash;
  7. while (@array) {
  8.     my $k = shift @array;
  9.     my $v = shift @array;
  10.     $hash{$k} += $v;
  11. }
  12. print Dumper \%hash;
复制代码

论坛徽章:
0
发表于 2012-10-25 09:29 |显示全部楼层
hash的key是唯一的,lz的原始数据应该还只是存放于array中,只是在作者心目中已经当作hash了。如果想实现相加后存放入hash的功能,用8楼的方法 :wink:

论坛徽章:
0
发表于 2012-10-25 23:14 |显示全部楼层
回复 5# jason680

这个方法应该可以解决楼主的问题

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP