2011-03-13 11 views
7

नीचे दिए गए डेटा ब्लॉक पर विचार करें, मैं सरणी को तीसरे क्षेत्र द्वारा क्रमबद्ध कैसे बनाए रख सकता हूं, और वस्तुओं को धक्का दे सकता हूं?पर्ल एक क्रमबद्ध सरणी में धक्का

$VAR1 = [ 
      '1111', 
      'http://...', 
      3  #this is one of the 3rd field mentioned above 
     ]; 
$VARN = [ 
      '5555', 
      'http://...', 
      0 
     ]; 


मेरे कोड लगता है:

my @curItem = ($item->{id}, $item->{href}, getTotal($item->{id})); 
push @items, \@curItem; 

मैं this मॉड्यूल जो मैं क्या जरूरत के समान है मिल गया है।

किसी भी मदद की सराहना की।

उत्तर

8

आपको लगता है कि मॉड्यूल का उपयोग कर सकते हैं, तो आप सिर्फ प्रकार की आपूर्ति करने की जरूरत है:।

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] };

(या उन पंक्तियों के साथ कुछ ... मैं इसे चेक करना होगा मूल रूप से, आप की जरूरत है सरणी के तत्व के आधार पर क्रमबद्ध करें जिसमें आप गुजर रहे हैं)

संपादित करें: हाँ, यह आपके डेटा के लिए काम करता है। बस यह जाँच:

use Tie::Array::Sorted; 

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] }; 

push @a, [ "1111", "http:// ...", 3]; 
push @a, [ "5555", "http:// ...", 0]; 

foreach $ref (@a) 
{ 
    print $ref . "\n"; 
    print "@$ref \n"; 
} 

आउटपुट:

ARRAY(0x9130888) 
5555 http:// ... 0 
ARRAY(0x90dd818) 
1111 http:// ... 3 
3

ठीक है, धक्का कोई बात नहीं क्या सूची के अंत में आइटम संलग्न करने के लिए जा रहा है। यह एक ढेर ऑपरेशन है। मैं कहूंगा कि आप एक अलग डेटा संरचना का उपयोग कर बेहतर हो सकते हैं, जैसे कि हैश और फिर आवश्यक होने पर केवल कुंजी या मान द्वारा सॉर्ट करना। आप जो लिखने की कोशिश कर रहे हैं उसके बारे में अधिक जानकारी के बिना, यह कहना मुश्किल है।

अन्यथा, आपको एक सबराउटिन लिखना होगा जो सर्वोत्तम डालने के लिए सूची की खोज करता है, फिर आइटम को इंजेक्ट करने के लिए स्प्लिस का उपयोग करता है। यह वही लगता है जो आप करना चाहते हैं, लेकिन मुझे यकीन नहीं है कि यह विशेष रूप से कुशल होगा, क्योंकि जब भी आप सॉर्ट किए गए ऑर्डर को बनाए रखते हुए किसी आइटम को जोड़ना चाहते हैं तो आपको सम्मिलित बिंदु के लिए सूची खोजनी होगी।

+0

सहमत हुए। सवाल कुछ तर्कसंगत असंगत मांग रहा है; आप दोनों एक विशेष सॉर्ट किए गए ऑर्डर * और * 'push' पर सरणी नहीं रख सकते हैं क्योंकि परिभाषा के अनुसार 'पुश', आइटम को उनके द्वारा जोड़े गए क्रम के आधार पर स्टोर करता है, उनकी सामग्री के आधार पर नहीं। सॉर्ट किए गए आवेषण करने की दक्षता के लिए, सम्मिलन पर डेटा सॉर्ट करना इसे सॉर्ट करने के सबसे तेज़ तरीकों में से एक है, साथ ही यह डेटा तक पहुंचने पर हर बार फिर से क्रमबद्ध करने की आवश्यकता से बचा जाता है, इसलिए यह सॉर्ट-ऑन- मामलों के भारी बहुमत में पहुंच। –

1

आप, @items लिए एक से अधिक सरणी संदर्भ जोड़ रहे हैं तो पहले संदर्भ जोड़ने, तो एक Schwartzian का उपयोग एक भी तरह कार्रवाई करने के लिए रूपांतरण करें:

@items = map $_->[1], sort { $a->[0] <=> $b->[0] } map { [ $_->[2], $_ ] } @items; 

रैंडल इस बारे में एक कॉलम में लिखा है: http://www.stonehenge.com/merlyn/UnixReview/col64.html

संबंधित मुद्दे