2013-02-06 55 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 

प्रिंट है कि मैं प्रकार के बाद हैं:

car, boat, chicken, mouse 

Btw, @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

क्रमबद्ध करने के लिए सरणी 'सूची' है, न कि 'ऑर्डरबी'। – Toto

+0

ओह, टाइपो। फिक्स्ड। – ikegami

+0

ओह, वह तेज़ था। अब मैं मानचित्र को समझने की कोशिश करूंगा। धन्यवाद! – Jonathan

0

निश्चित रूप से अगर आप आदेश में सभी संभावित मदों की एक सूची है, और आइटम आप चाहते हैं की एक छोटी सूची करना चाहते हैं चुनने के लिए, तो यह वास्तव में एक चयन समस्या है, और एक सॉर्टिंग समस्या नहीं है? हे में

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

चलाता है (एन) के बजाय O (n n लॉग इन करें) भी :)

+0

यह मूल रूप से 4 दिनों पहले पोस्ट किए गए समाधानों के दूसरे जैसा ही है, मेरे बेहतर को छोड़कर क्योंकि यह डुप्लीकेट को संभालता है, और आपका ओपी के चश्मा को पूरा नहीं करता है क्योंकि यह नहीं करता है। – ikegami

0

मूलांक तरह है कि मामले के लिए एक अच्छा विकल्प है की तुलना में समय:,

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