免费注册 查看新帖 |

Chinaunix

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

如何判断数字连续。。。 [复制链接]

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-18 10:11 |只看该作者 |倒序浏览
本帖最后由 mcshell 于 2012-10-18 10:12 编辑

转自SHELL版块。。
cat file.txt
abc 1
abc 2
abc 3
cde 1
cde 2
fff 1
fff 2
fff 3
fff 5
fff 7
fff 9
fff 10
fff 11
fff 12
fff 13
想要处理成
abc:1-3
cde:1-2
fff:1-3,5,7,9-13

====
就是按第一列分组,第二列如果是连续的,就用1-4这样,不是连续的就用逗号分割,2,5,6,这样。


自己试着写了,可以判断数字连续,但是想不到如何取首尾两个数字。。。
code:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. my %hash;
  6. my @line;
  7. while(<DATA>){
  8.   @line=split;
  9.   push @{$hash{$line[0]}},$line[1];

  10. }
  11. map{print "$_:";
  12.         my $letter = $_;
  13.        
  14.          my $num = @{$hash{$letter}}        ;
  15.         for(my $i=0;$i<$num;$i++){
  16.            if(
  17.                    (($hash{$letter}[$i+1]||0) - $hash{$letter}[$i] == 1)
  18.                    ||
  19.                    ($hash{$letter}[$i+1]||0)- $hash{$letter}[$i] == -($hash{$letter}[$i])
  20.                    || ($hash{$letter}[$i]  == $hash{$letter}[$i-1] + 1)
  21.                    ){
  22.                         print  $hash{$letter}[$i]."-";
  23.            }else{
  24.                    print   ",$hash{$letter}[$i]";
  25.            }
  26.         }
  27.         print "\n"}keys %hash;
  28. __DATA__
  29. abc 1
  30. abc 2
  31. abc 3
  32. cde 1
  33. cde 2
  34. fff 1
  35. fff 2
  36. fff 3
  37. fff 5
  38. fff 7
  39. fff 9
  40. fff 10
  41. fff 11
  42. fff 12
  43. fff 13
  44. 输出:
  45. F:\perl\cu>info.pl
  46. cde:1-2-
  47. abc:1-2-3-
  48. fff:1-2-3-,5,79-10-11-12-13-
复制代码
求指导一下。。。。
也想看看大家的方法。

论坛徽章:
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
2 [报告]
发表于 2012-10-18 11:56 |只看该作者
很久之前就写过这个啊。

$s = "1,2,3,5,7,9,10,11,12,13";

1 while $s =~ s/(-)?(\d+),(\d++)(?(?{$3 != $2+1})(*F))/ defined $1 ?  "-$3" : "$2-$3" /e;

say $s;

论坛徽章:
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
3 [报告]
发表于 2012-10-18 12:00 |只看该作者
第一个数字可以回溯出错啊。改下

1 while $s =~ s/(-)?(?<!\d)(\d+),(\d++)(?(?{$3 != $2+1})(*F))/ defined $1 ?  "-$3" : "$2-$3" /e;

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [报告]
发表于 2012-10-18 12:10 |只看该作者
回复 3# 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
5 [报告]
发表于 2012-10-18 12:42 |只看该作者
回复 4# mcshell


    两个相临的数字如果满足 $a, $a+1 那它们之间的逗号可以替换为 ‘-’ ,如果左边那个数字前面有个 ‘-’ 那左边那个数字就可以省掉。比如(2-3,4) 3 前面有 '-' 3 和逗号删除即为 2-4。然后从左到右发现这种模式即替换,那么所有相邻的数字都会收敛起来,直到不存在这种模式。


(-)?(?<!\d)(\d+),(\d++) 捕获两个相临的完整的数字,如果第一个数字前面有 '-' 也捕获它。(?<!\d) 保证第一个数字不会被截断, \d++ 的++保证第二个数字不会被截断。

(?(?{$3 != $2+1})(*F)) 是个逻辑判断,如果 第二个数字 != 第一个数字 + 1 ,那判断为匹配失败,(*F) 表示匹配时永远失败。如果没有这个语句,那 3,5 这样的不能合并的会导致 while 死循环。

替换部分就是处理左边那个数字前面是否有 '-' 的。

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
6 [报告]
发表于 2012-10-18 13:27 |只看该作者
回复 5# zhlong8


    学习了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP