2013-05-06 33 views
6

Giả sử tôi có hai mảng mà trông như thế này:loại một mảng theo yếu tố của một mảng thứ hai

('1', '6', '8', '4', '5') 
('a', 'c', 'd', 'f', 'w') 

Tôi muốn sắp xếp mảng đầu tiên, và thứ tự các phần tử trong mảng thứ hai nên thay đổi trong tương tự như mảng đầu tiên, do đó thứ tự của cả hai sẽ như sau:

('1', '4', '5', '6', '8') 
('a', 'f', 'w', 'c', 'd') 

Bất kỳ ý tưởng nào về cách thực hiện điều đó trong Perl?

Trả lời

10

Bạn cần phải sắp xếp các chỉ số vào mảng. Giống như

use strict; 
use warnings; 

my @aa = qw/ 1 6 8 4 5 /; 
my @bb = qw/ a c d f w /; 

my @idx = sort { $aa[$a] <=> $aa[$b] } 0 .. $#aa; 

@aa = @aa[@idx]; 
@bb = @bb[@idx]; 

print "@aa\n"; 
print "@bb\n"; 

sản lượng này

1 4 5 6 8 
a f w c d 
+1

Dường như với tôi như bài tập về nhà @Abdel? :) –

+0

Haha, không có điều này là không bài tập về nhà, tôi chỉ đơn giản là một vấn đề thực tế mà tôi có :) Cảm ơn cho câu trả lời, nó hoạt động một cách hoàn hảo! – Abdel

+0

$ a và $ b là gì? 0 là gì? –

2

câu trả lời Borodin là một phản ứng tuyệt vời và Perlish nhất cho câu hỏi của bạn. Nó xảy ra với tôi rằng cấu trúc dữ liệu của bạn cho thấy rằng một băm có thể được sử dụng, do đó, đây là một ví dụ về liên quan dữ liệu thông qua một băm và phân loại theo cách đó.

use strict; 
use warnings; 
use List::MoreUtils qw(mesh); 

my @aa = qw/ 1 6 8 4 5 /; 
my @bb = qw/ a c d f w /; 

my %x = mesh @aa, @bb; 
print join(" ", sort keys %x), "\n"; 
print join(" ", @x{sort keys %x}), "\n"; 
3

Bạn có thể sử dụng hàm băm. Sử dụng các giá trị từ mảng đầu tiên làm khóa cho các giá trị được lấy từ mảng thứ hai. Sau đó, chỉ cần thực hiện foreach my $key (sort keys %the_hash) { do stuff }. Nếu các giá trị khóa không phải là duy nhất thì sử dụng một mảng băm của mảng và đẩy các giá trị vào hàm băm.

#! perl 
use strict; 
use warnings; 

my @key_data = ('1', '6', '8', '4', '5', '4', '5'); 
my @val_data = ('a', 'c', 'd', 'f', 'w', 'z', 'w'); 

my %the_hash; 

for (my $ii=0; $ii<=$#key_data; $ii++) { 
    push @{$the_hash{$key_data[$ii]}}, $val_data[$ii]; 
} 

for my $key (sort keys %the_hash) { 
    print "key $key\n"; 
    foreach my $val (@{$the_hash{$key}}) { 
     print "  $val\n"; 
    } 
} 
Các vấn đề liên quan