2013-05-06 3 views
6

한다고 가정 제 2 어레이의 소자에 따른 어레이 :정렬 I는 다음과 같이 두 가지 배열이

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

I 처음 배열 한 변화한다 번째 배열 요소의 순서를 정렬 할 첫 번째 배열과 같은 방식으로 두 순서가 다음과 같이됩니다.

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

Perl에서이를 수행하는 방법에 대한 아이디어가 있습니까?

답변

10

색인을 배열로 정렬해야합니다. 이

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"; 

출력처럼

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

@Abdel 숙제처럼 보입니까? :) –

+0

하하, 이건 숙제가 아니야, 나는 단지 내가 가진 실제 문제를 단순화했다 :) 답변 주셔서 감사합니다, 그것은 완벽하게 작동합니다! – Abdel

+0

$ a와 $ b는 무엇입니까? 0은 무엇입니까? –

2

보로딘의 대답은 질문에 대한 우수하고 가장 Perlish 반응이다. 데이터의 구조가 해시가 유용 할 것이라고 제안하는 경우가 발생하므로 해시를 통해 데이터를 연결하고 그런 식으로 정렬하는 예가 있습니다.

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

해시를 사용할 수 있습니다. 첫 번째 배열의 값을 두 번째 배열에서 가져온 값의 키로 사용하십시오. 그런 다음 foreach my $key (sort keys %the_hash) { do stuff }을 수행하십시오. 키 값이 고유하지 않으면 배열의 해시를 사용하고 값을 해시로 푸시합니다.

#! 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"; 
    } 
} 
관련 문제