2013-02-06 21 views
9

Aşağıdakileri yapmaya çalışıyorum. Belirli bir listedeki "order by" olarak kullanılacak önceden tanımlanmış bir listeye sahibim.Belirli bir siparişle bir listeyi nasıl sıralayabilirim?

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'); 

Sıralamak için sonsuz yöntemler denedim ve istediğimi alamadım. Google'da arama yaptım ve burada, ama cevabı bulamadım.

@list ihtiyacı bu şekilde sıralanmasını:

sort @list using %orderby 

Ben sıralamadan sonra istediğiniz yazdırma: BTW

car, boat, chicken, mouse 

, @list çoğaltılmış olabilir girişleri:

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

Bu durumda, baskı şu şekilde olmalıdır:

car, car, boat, chicken, mouse, mouse

Bunun için bir çözümünüz var mı? veya belki başka bir yaklaşım. Teşekkürler!

+1

, benim çözümler çiftleri ele alır. – ikegami

+0

evet, bunu test ettim! Yine Thx! – Jonathan

cevap

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; 

Yoksa insanların kafasında ile karışıklık, Şüphesiz

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

Sıralanacak dizi "order" değil "list". – Toto

+0

oops, typo. Sabit. – ikegami

+0

oh, bu hızlıydı. Şimdi haritayı anlamaya çalışacağım. teşekkür ederim! – Jonathan

0

Sırası ile potansiyel öğelerin listesini varsa ve istediğiniz öğelerin daha küçük bir liste istiyorsanız seçmek için, bu aslında bir seçim problemidir ve bir sıralama problemi değil midir? O'da

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

çalıştırır (n) yerine O (n log n) çok :)

+0

Bu temelde, 4 gün önce gönderdiğim çözümlerin ikincisiyle aynı, benimki daha iyi olduğu için çift daha iyi olduğu için ve OP'lerin özelliklerine uymuyor çünkü sizinki gibi değil. – ikegami

0

Radix sıralama bu durum için iyi bir seçimdir daha zamanı: Güncellemenize Re

use Sort::Key::Radix qw(ukeysort); 
@sorted = ukeysort { $orderby{$_} } @data; 
İlgili konular