免费注册 查看新帖 |

Chinaunix

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

请教高效的数组比较方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-27 13:26 |只看该作者 |倒序浏览
本帖最后由 justu78 于 2013-07-27 17:27 编辑

我想比较若干个数组(数组的个数在程序运行中会变化),数组内容可能是字符串,可能是数字,不一定。 需要查看是否所有的数组完全一样,我写的子程序如下,有时数组会很大,所以我感觉效率不会高,想问下有没有更高效率的代码?

sub CompareArray{
  use strict;
  my(@array_ref)=@_;
  my($i,$j,$k,@array,@array1,$number);
  $number='[+-]?\d+[\.]?\d*[eE][+-]?\d+|[+-]?[\.]\d+[eE][+-]?\d+|[+-]?\d+[\.]?\d*|[+-]?[\.]\d+';
  for($i=0;$i<=$#array_ref-1;$i++){
   @array=@{$array_ref[$i]};
   for($j=$i+1;$j<=$#array_ref;$j++){
     @array1=@{$array_ref[$j]};
     if($#array!=$#array1){
       return(0);
     }else{
       for($k=0;$k<=$#array1;$k++){
        if($array[$k]=~/^$number$/ && $array1[$k]=~/^$number$/){
          if($array1[$k]!=$array[$k]){
            return(0);
          }
        }elsif($array[$k]!~/^$number$/ && $array1[$k]!~/^$number$/){
          if($array1[$k] ne $array[$k]){
            return(0);
          }
        }else{
          return(0);
        }
       }
     }
   }
  }
  return(1);
}

论坛徽章:
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 [报告]
发表于 2013-07-27 18:00 |只看该作者
如果你是 5.10.1 以上版本可以用 smart match, 文档在 perlop。$array_ref1 ~~ $array_ref2 就可以知道他们是否匹配,“相等”这个概念有很多层次这里~~的行为应该正是你想要的

论坛徽章:
0
3 [报告]
发表于 2013-07-28 11:35 |只看该作者
zhlong8 发表于 2013-07-27 18:00
如果你是 5.10.1 以上版本可以用 smart match, 文档在 perlop。$array_ref1 ~~ $array_ref2 就可以知道他们 ...

谢谢,还有这个操作符啊。看来如果考虑兼容性,还不能贸然使用

论坛徽章:
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
4 [报告]
发表于 2013-07-28 21:07 |只看该作者
justu78 发表于 2013-07-28 11:35
谢谢,还有这个操作符啊。看来如果考虑兼容性,还不能贸然使用


没必要,5.10 都已经不再维护了,还兼容之前的意义不大

论坛徽章:
0
5 [报告]
发表于 2013-07-29 12:48 |只看该作者
zhlong8 发表于 2013-07-28 21:07
没必要,5.10 都已经不再维护了,还兼容之前的意义不大

我公司里还用的是5.8.....

论坛徽章:
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
6 [报告]
发表于 2013-07-29 13:48 |只看该作者
回复 5# justu78


    那可以这样

use Scalar::Util 'looks_like_number';

sub array_equal {
    my($a, $b) = @_;
    return 0 if @$a != @$b;
    for (0 .. @$a - 1) {
        if (looks_like_number $a->[$_] and looks_like_number $b->[$_]) {
            return 0 if $a->[$_] != $b->[$_];
        } else {
            return 0 if $a->[$_] ne $b->[$_];
        }
    }
    return 1;
}

looks_like_number 会对数字,符合数字语法的字符串都返回真。

论坛徽章:
0
7 [报告]
发表于 2013-07-29 20:01 |只看该作者
zhlong8 发表于 2013-07-29 13:48
回复 5# justu78

实际 上你说的这个模块就是判断某个变量是否是数字,那我写的子程序里的变量$number就是用来作这个的(整数,浮点数,科学技术),暂时没有包括其他的数字形式,比如二进,六进,或者类似1u,1p,1A等,因为我的工作不包括这些数据格式,如果需要可以修改$number用于模式匹配,这样的话应该要比调用模块的效率要高吧?另外,我需要比较的数组不一定是两个,可能是3个,4个,5个。。。不一定的,所以单比较两个数组看不出效率来吧,关键是多个数组的比较效率如何提高呢???

论坛徽章:
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
8 [报告]
发表于 2013-07-29 22:56 |只看该作者
回复 7# justu78


    用自己最顺手的方式解决问题就好,随着经验累积自然会找到更简洁高效的方法。测试性能可以用 Benchmark 模块,练下手自己测试吧

论坛徽章:
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
9 [报告]
发表于 2013-07-30 23:57 |只看该作者
zhlong8 发表于 2013-07-27 14:00
如果你是 5.10.1 以上版本可以用 smart match, 文档在 perlop。
  1. $array_ref1 ~~ $array_ref2
复制代码
就可以知道他们 ...

谢谢,学习了 {:3_188:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP