如何在每个第n个元素上对Perl数组进行排序

时间:2016-02-01 21:32:37

标签: arrays perl sorting

我从以制表符分隔的文件中读取Perl数组,格式为:

FirstName1 TAB LastName1
FirstName2 TAB LastName2
FirstName3 TAB LastName3

每行有三个元素 - FirstName,TAB,LastName - 这是必要的,因为并非所有姓氏都是单个strIngs

例如

Betty Van der Bildt

如何对LastName上的数组进行排序,然后对FirstName进行排序,请保留TAB?

2 个答案:

答案 0 :(得分:2)

我认为你的意思是这个

my @sorted_names = sort {
    my ($aa, $bb) = map [ split /\t/ ], $a, $b;
    $aa->[1] cmp $bb->[1] or $aa->[0] cmp $bb->[0];
} @names;


以下是您的评论中直接应用于上述排序的数据。如您所见,输出按姓氏后跟名字

排序
use strict;
use warnings 'all';

my @names = (
    "Mike\tEddelman\n",
    "Saleena\tFAhmad\n",
    "Patrick\tGainley\n",
    "Tim\tHaitkin\n",
    "Sue\tHaitken\n",
    "Desmond\tLeacock\n",
);

my @sorted_names = sort {
    my ($aa, $bb) = map [ split /\t/ ], $a, $b;
    $aa->[1] cmp $bb->[1] or $aa->[0] cmp $bb->[0];
} @names;

print @sorted_names;

输出

Mike    Eddelman
Saleena FAhmad
Patrick Gainley
Sue Haitken
Tim Haitkin
Desmond Leacock


要进行与案例无关的排序,您应该对要比较的每个值使用fc

注意

use feature 'fc'

在程序的顶部,这对于这项工作至关重要。这仅适用于Perl 5版本16及更高版本

use strict;
use warnings 'all';
use v5.16;
use feature 'fc';

my @names = (
    "Mike\tEddelman\n",
    "Saleena\tFAhmad\n",
    "Patrick\tGainley\n",
    "Tim\tHaitkin\n",
    "Sue\tHaitken\n",
    "Desmond\tLeacock\n",
    "Oliver\taabeginningWilliams\n",
    "Christina\tvan Melzen\n",
    "Ekatarina\tvan den Rekk\n",
);

my @sorted_names = sort {
    my ($aa, $bb) = map [ split /\t/ ], $a, $b;
    fc $aa->[1] cmp fc $bb->[1] or fc $aa->[0] cmp fc $bb->[0];
} @names;

print @sorted_names;

输出

Oliver  aabeginningWilliams
Mike    Eddelman
Saleena FAhmad
Patrick Gainley
Sue Haitken
Tim Haitkin
Desmond Leacock
Ekatarina   van den Rekk
Christina   van Melzen

答案 1 :(得分:1)

如果你只有一小部分要排序的话,鲍罗丁的回答很好。你可以使用Schwartzian变换来提高效率。

my @sorted_names = 
    map $_->[1],                    # Extract original values
    sort { 
      $a->[0][1] cmp $b->[0][1]  # Two level sort
      || $a->[0][0] cmp $b->[0][0]
    }  
    map [ [split /\t/], $_ ],       # Precompute comparison function, saving original values
    @names;

警告 - 我还没有对此进行基准测试。对于一些数据集,重复分割字符串可能比访问深度数组结构更快。一般来说,如果您有昂贵的排序标准和大数据集,这种技术就是胜利者。

相关问题