我有2D数组:
my @array = ([3,4,1,2], [Black,Orange,White,Blue]);
我需要按第一行对其进行排序,因此预期结果是
1,2,3,4
White, Blue, Black, Orange
在perl中有什么快速的方法吗? 我知道如何分别对每一行进行排序,但这不是目标。
答案 0 :(得分:1)
我不确定Perl中2D数组的含义。
根据您问题的表示法,有2个单独的数组引用:
$array_ref1 = [3, 4, 1, 2];
$array_ref2 = ['Black', 'Orange', 'White', 'Blue'];
2D数组可能是其中之一:
@array_of_arrayrefs = ([3, 'Black'], [4, 'Orange'], [1, 'White'], [2, 'Blue']);
%hash = (3 => 'Black', 4 => 'Orange', 1 => 'White', 2 => 'Blue');
在大多数情况下,我建议尽可能使用散列-您可以在此处阅读一些有关散列的信息:Hashes in Perl
您可以将sort function用于数组
# for array_of_arrayrefs
my @sorted_array = sort { $a[0] <=> $b[0] } @array_of_arrayrefs;
由于哈希是键值对的无序组,因此只需调用keys function并对结果数组进行排序(根据需要使用它来调用哈希值)。
答案 1 :(得分:0)
如果您具有关联的键和值,那么我首先要说的是要将数组转置为哈希:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @array = ([3,4,1,2], ["Black","Orange","White","Blue"]);
my %mapping;
#Assign 'first array' as keys, and second array as values.
@mapping{@{$array[0]}} = @{$array[1]};
#for debugging
print Dumper \%mapping;
my @sorted_keys = sort keys %mapping;
print join (",", @sorted_keys),"\n";
print join (",", @mapping{@sorted_keys} ),"\n";
在散列切片分配方面,我的工作很简单,但是它允许您执行任意排序并保持键值关系。
您也可以将其调整为适用于多行输入,以保留列关系,尽管它确实变得有点复杂,您不能再像我一样使用哈希切片分配,但是您可以构建每一行分成键值对,然后按需打印或合并它们以仅对列值进行一次哈希处理。