2013-02-06 3 views
9

다음 작업을 수행하려고합니다. 주어진 목록에서 "주문"으로 사용할 미리 정의 된 목록이 있습니다.주어진 순서로 목록을 정렬하는 방법은 무엇입니까?

my @orderby = ('car', 'boat', 'chicken', 'cat', 'dog', 'mouse'); 
    or 
my %orderby = ('car' => 0, 'boat' => 1, 'chicken' => 2, 'cat' => 3, 'dog' => 4, 'mouse' => 5); 

my @list = ('boat', 'car', 'mouse', 'chicken'); 

나는 그것을 정렬하는 무한한 방법을 시도하고 내가 원하는 것을 얻지 못했습니다. 나는 Google에서 검색 한 적이 있지만 여기에서는 대답을 찾지 못했습니다.

@list 필요가 그런 식으로 정렬합니다 :

sort @list using %orderby 

내가 정렬 후 원하는 인쇄 : BTW

car, boat, chicken, mouse 

, @list 중복 한 수있는 항목 :

my @list = ('boat', 'car', 'mouse', 'chicken', 'mouse', 'car');

이 경우 인쇄물은 다음과 같아야합니다.

car, car, boat, chicken, mouse, mouse

여러분은 해결책이 있습니까? 또는 다른 접근 방법 일 수 있습니다. 감사합니다.

+1

, 내 솔루션은 중복을 처리합니다. – ikegami

+0

예, 테스트 해 보았습니다! 다시 Thx! – Jonathan

답변

12
my @orderby = qw(car boat chicken cat dog mouse); 
my @list = qw(boat car mouse chicken); 

my %orderby = map { $orderby[$_] => $_ } 0..$#orderby; 

my @sorted = sort { $orderby{$a} <=> $orderby{$b} } @list; 

또는 당신은 사람들의 마음과 혼란, 확실하게

my @orderby = qw(car boat chicken cat dog mouse); 
my @list = qw(boat car mouse chicken); 

my %counts; ++$counts{$_} for @list; 
my @sorted = map { ($_) x ($counts{$_}||0) } @orderby; 
+1

정렬 할 배열은'orderby'가 아니라'list'입니다. – Toto

+0

오케이, 오타. 결정된. – ikegami

+0

오, 내 것이 빠르다. 이제지도를 이해하려고 노력할 것입니다. 고맙습니다! – Jonathan

0

당신이 순서에있는 모든 잠재적 인 항목의 목록이있는 경우, 당신은 할 항목의 작은 목록을 원하는 경우 이것을 선택하려면 실제로 선택 문제이며 정렬 문제가 아닙니까? O에서

my %items = map { $_ => 1 } @list; 
my @items = grep { $items{$_} } @orderby; 

를 실행합니다 (n)이 아닌 O (N 로그 n)이 너무 :

+0

기본적으로 4 일 전에 게시 한 솔루션의 두 번째 것과 동일합니다. 중복을 처리하고 내 제품이 OP의 사양을 충족시키지 않아 내 제품이 더 뛰어나다는 것을 제외하고는 그렇지 않습니다. – ikegami

0

기수 정렬은이 경우를위한 좋은 선택보다는 시간 : 당신의 업데이트를 다시

use Sort::Key::Radix qw(ukeysort); 
@sorted = ukeysort { $orderby{$_} } @data; 
관련 문제