免费注册 查看新帖 |

Chinaunix

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

数组元素排序:按指定关键字顺序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-13 15:02 |只看该作者 |倒序浏览
数组元素排序:按指定关键字顺序

@keys = qw/ key1 key2 key3 key4 /;
@lines =  (
        key3: ...,
        key1: ...,
        key2: ...,
        key4: ...,
        );
想按@keys中的顺序对@lines排序。

我的想法是遍历@keys,对每个key到@lines去查找,找到后push到新的数组,思路比较笨,大家给点建议吧

论坛徽章:
0
2 [报告]
发表于 2010-04-13 15:23 |只看该作者
@newArray = @lines{@keys};

好像 和你的push 差不多{:3_196:}

论坛徽章:
0
3 [报告]
发表于 2010-04-13 15:30 |只看该作者
额   好像理解错了   以为是hash了
{:3_190:}

论坛徽章:
0
4 [报告]
发表于 2010-04-14 14:14 |只看该作者
@newArray = @lines{@keys};

好像 和你的push 差不多
guap514 发表于 2010-04-13 15:23



    @lines{@keys};
偶没遇到过 谁解释解释?

论坛徽章:
0
5 [报告]
发表于 2010-04-14 14:16 |只看该作者
遍历@lines 直接print @keys 到新数组

论坛徽章:
0
6 [报告]
发表于 2010-04-14 19:54 |只看该作者
回复 4# nuclearxin


    好像是叫哈希切片  不过lz的不是哈希 就没用了

论坛徽章:
0
7 [报告]
发表于 2010-04-15 08:39 |只看该作者
hash切 不是%hash{@array}吗?

论坛徽章:
0
8 [报告]
发表于 2010-04-15 09:56 |只看该作者
hoho 知道啦 % 是结构
所以不能print大

论坛徽章:
0
9 [报告]
发表于 2010-04-15 18:26 |只看该作者
回复 1# maybenot


(1)如果是要按指定的顺序输出hash的话,  guap514 的方法就很好, @newArray = @lines{@keys};

(2)如果是数组的话, 可以用一个hash来辅助一下, 速度在数据量很大的情况下应该比每次都扫描一下数组要快, 当然这个辅助hash用了很大的空间.
算是空间换时间吧. 此外对于sort体内的正则表达式, 可以用Memoize这个module来缓存, 这样对于大的数组的话, 可以进一步节省时间, 相应的用了更多的空间:
比如:
my @ks = ('c', 'b', 'd', 'a');
my @lines = ('a:123', 'b:456', 'c:789', 'd:101112');
my %h2;
for my $i (0..$#ks ) {
     $h2{$ks[$i]} = $i;
}

my @newlines = sort { my($k1) =$a=~ m/^(\w+):/; my ($k2)=$b=~ m/^(\w+):/; $h2{$k1}<=>$h2{$k2}; } @lines;

论坛徽章:
0
10 [报告]
发表于 2010-04-20 09:42 |只看该作者
回复 9# hp_truth


    正是这个效果!非常感谢hp_truth,以及楼上各位,这里高手真多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP