2010-08-27 12 views
6

मैं बहुत तरह हैश का एक हैश है,:मैं हैश के हैश से मूल्यों को कैसे मैप (और सॉर्ट) कर सकता हूं?

 
%hash = (a => { b => 1, c =>2, d => 3}, 
      a1 => { b => 11, c =>12, d => 13}, 
      a2 => { b => 21, c =>22, d => 23}) 

मैं तत्व "बी" निकालने और यह एक सरणी में रखना चाहते हैं। अभी, मैं हैश के माध्यम से ऐसा करने के लिए लूप कर रहा हूं, लेकिन मुझे लगता है कि मैं इसके बजाय मानचित्र का उपयोग कर दक्षता में सुधार कर सकता हूं। मैं बहुत यकीन है कि अगर यह हैश की एक सरणी था, मैं कुछ इस तरह का उपयोग करेंगे हूँ:

 
@hasharray = ({ b => 1, c =>2, d => 3}, 
       { b => 11, c =>12, d => 13}, 
       { b => 21, c =>22, d => 23}) 
@array = map { ($_->{b} => $_) } @hasharray 

मुझे माफ कर दो अगर मैं गलत, मैं अभी भी सीख रहा हूँ कैसे नक्शा काम करता हूँ। लेकिन मैं क्या जानना चाहता हूं कि मैं हैश के हैश मैपिंग के बारे में कैसे जाउंगा? क्या नक्शा का उपयोग करना भी संभव है? मुझे अभी तक ऐसा करने का कोई उदाहरण नहीं मिला है।

इससे भी बेहतर, इस कोड में अगला चरण आबादी को एक बार घुमाए जाने के बाद सॉर्ट करना है। मुझे पूरा यकीन है कि यह संभव है, लेकिन मैं इसे स्वयं समझने के लिए मानचित्र का उपयोग करने के लिए पर्याप्त स्मार्ट नहीं हूं। मैं इसे एक शॉट में कैसे करूँगा?

धन्यवाद। सेठ

उत्तर

11

यह अर्क और सॉर्ट करता सब "बी" रों:

my @array = sort { $a <=> $b } map $_->{b}, values %hash; 
+0

यह बहुत अच्छा काम करता था, ठीक वही जो मैं खोज रहा था। मैंने कोड के 26 लाइनों को इस के साथ बदल दिया, और उस कार्य के प्रदर्शन को ओ (एन) से ओ (1) के बारे में बेहतर किया। धन्यवाद! – sgsax

+1

ठीक है, इसे अभी भी हैश के मानों के माध्यम से पुन: प्रयास करना है और उन्हें सॉर्ट करना है, इसलिए यह वास्तव में ओ (1) नहीं है। – Corey

1

अपने दूसरे समाधान ले लो, और values %hash@hasharray के लिए स्थानापन्न:

@array = map { ($_->{b} => $_) } values %hash; 

(। और ; मत भूलना बयान समाप्त करने के लिए)

3

यह सरणी संदर्भ, प्रत्येक का एक क्रमबद्ध सूची के साथ @array भरता है जिसमें b का मान शामिल है और यह हैशफ से आया है।

my @array = sort {$$a[0] <=> $$b[0]} 
      map { [$$_{b} => $_] } 
      values %hash; 

my @sorted_hashes = map {$$_[1]} @array; 
+1

'$ a -> [0]' $$ एक [0] 'से पढ़ने के लिए आसान है; '$$ _ {b}' की बजाय '_ _-> {b}' '। –

+0

संख्याओं को सॉर्ट करते समय 'cmp' के बजाय '<=>' ऑपरेटर का उपयोग करना बेहतर है। –

+0

@ यूजीन => अच्छा बिंदु, फिक्सिंग। @ फिलिप => मैं दो कारणों से दोगुनी सिग्ल्स पसंद करता हूं। सबसे पहले, यह '@ $ a [1, 2]' जैसे डीरफ्रेंसिंग के अन्य रूपों के साथ है। दूसरा, '->' ऑपरेटर विधि कॉल के लिए उपयोग किया जाता है, इसलिए मैं केवल उन स्थितियों में इसका उपयोग करना पसंद करता हूं जहां कोड कहा जाता है। –

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

  • कोई संबंधित समस्या नहीं^_^