Как отсортировать 2D массив по одной строке в Perl? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть 2D-массив:

my @array = ([3,4,1,2], [Black,Orange,White,Blue]);

Мне нужно отсортировать его по первой строке, поэтому ожидаемый результат -

1,2,3,4
White, Blue, Black, Orange

Есть ли быстрый способсделать это в Perl?Я знаю, как сортировать каждую строку отдельно, но это не цель.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Я не уверен, что вы подразумеваете под 2D-массивом в Perl.
Из обозначений в вашем вопросе есть 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');

В большинстве случаев я бы порекомендовал использовать хэши, если это возможно - о них можно прочитать здесь: Хэши в Perl

Вы можетеиспользуйте функцию сортировки для массивов

# for array_of_arrayrefs
my @sorted_array = sort { $a[0] <=> $b[0] } @array_of_arrayrefs;

Поскольку хэш - это неупорядоченная группа пар ключ-значение, просто вызовите keys keys и отсортируйте массив результатов(используя его для вызова нужного значения хеша).

0 голосов
/ 04 апреля 2019

Если у вас есть связанные ключи и значения, тогда я бы сказал, что сначала вы хотите преобразовать массив в хеш:

#!/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";

Я остановился на тривиальном случае с присваиванием хеш-фрагмента, но он позволяет вам выполнять произвольные сортировки и поддерживать отношение ключ-значение.

Вы также можете адаптировать это для многострочного ввода, сохраняя отношения столбцов, хотя это немного усложняется: вы не можете использовать назначение хеш-фрагмента, как я делал больше, но вы можете построить каждую строку в пары ключ-значение и либо напечатайте их, либо объедините, чтобы получить только один хэш столбчатых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...