रूबी की एरे # शिफ्ट क्या करती है?


88

मुझे यह समझने में मुश्किल समय आ रहा है कि रूबी में ऐरे क्लास की शिफ्ट और अनशिफ्ट के तरीके क्या हैं। क्या कोई मुझे यह समझने में मदद कर सकता है कि वे क्या करते हैं?


171
एक बार जब आप सीख लेते हैं कि यह सरणी के दूसरे छोर पर shift/unshiftहैं push/pop, तो आप मानसिक रूप से याद रखने के तरीकों में से 'f' को हटा सकते हैं कि कौन से 'डंप' तत्व हैं और कौन सा 'उन्हें' सम्मिलित करता है। :)
मेंढक

1
धन्यवाद कि वास्तव में योग्य मदद करता है।
agentbanks217

सबसे अच्छी टिप्पणियों में से एक! बहुत बहुत धन्यवाद :)
tvdeyen

18
@Phrogz वास्तव में, कशेरुक पाचन तंत्र, स्टैक की तुलना में कतारों के रूप में बेहतर रूप से तैयार किए गए हैं।
जियान

8
@ जियान :) सही: pushयह शीर्ष में है, और shiftयह दूसरे छोर से बाहर है।
फ्रॉग्ज

जवाबों:


98

रूबी प्रलेखन को देखते हुए

Array.shift सरणी से पहला तत्व निकालता है और उसे वापस करता है

a = [1,2,3] 
puts a.shift
 => 1 
puts a
 => [2, 3] 

अनशिफ्ट प्रदान किए गए मान को सरणी के सामने स्थित करता है, अन्य सभी तत्वों को एक ऊपर ले जाता है

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 

8
आप मूल रूप से शिफ्ट और unshift के बारे में सोच सकते हैं क्योंकि एक फीफो कतार पर संचालन किया जा रहा है
जैको

@JacoPretorius हह? shiftऔर जब तक मैं किसी चीज के बारे में भ्रमित नहीं होता, तब तक unshiftएक फिलो स्टैक की तरह काम करता हूं , pushऔर shiftएक फीफो कतार की तरह काम करता हूं।
ग्रेग शमित

@GregSchmit आह, आप सही कह रहे हैं। या वास्तव में, एक LIFO कतार, सही?
जैको प्रीटोरियस

@JacoPretorius अच्छा मुझे लगता है कि LIFO == FILO (सबसे पहले यह निकलता है कि पैटर्न रखने पर सबसे पहले आखिरी बार बाहर आना चाहिए)।
ग्रेग स्मिट

@JacoPretorius LIFO और FILO दोनों का अर्थ है "एक ढेर की तरह व्यवहार करना"।
ग्रेग स्मिट

52

shiftऔर इस unshiftतरह से कार्य करता है : popऔर pushवे सरणियों को स्टैक के रूप में उपयोग करने के लिए होते हैं, जिसमें आप तत्वों को जोड़ सकते हैं और निकाल सकते हैं (आमतौर पर एक बार)। अंतर सिर्फ इतना है कि है shiftऔर unshiftएक की शुरुआत में जोड़ें / निकालें तत्वों Array, वास्तव में बदलाव अन्य सभी तत्वों ing, जबकि popऔर pushके अंत में जोड़ें / निकालें तत्वों Array, इसलिए अन्य तत्वों 'सूचकांक संरक्षण।

उदाहरण:

                      # Spacing for clarity:
a = [2, 4, 8]    # a =>       [2, 4, 8]
a.push(16, 32)   # a =>       [2, 4, 8, 16, 32]
a.unshift(0, 1)  # a => [0, 1, 2, 4, 8, 16, 32]
a.shift          # a =>    [1, 2, 4, 8, 16, 32]
a.pop            # a =>    [1, 2, 4, 8, 16]

यदि आप मिपड़ी के धागे को संक्षेप में प्रस्तुत करने के लिए अपना उत्तर संपादित करते हैं, तो मुझे खुशी होगी।
स्टीवन सुदित

ठंडा। इसके अलावा, मैं रूबी के बारे में बहुत जानकार नहीं हूँ, लेकिन अगर यह JVM पर चलता है, तो मुझे उम्मीद है कि पुश / पॉप तेज़ होगा, क्योंकि इसमें उन सभी तत्वों को स्थानांतरित नहीं करना है।
स्टीवन सुदित

स्टैक सादृश्य के लिए अपवोट, लेकिन पाइप के बारे में भी सोचें। जैसा कि हम प्रोग्रामर होने वाले हैं, हम यह भी सोच रहे होंगे कि शिफ्ट एक लेफ्ट-लेफ्ट है और अनशिफ्ट एक लेफ्ट-राइट से राइट एरे पर शिफ्ट-राइट है।
मैकेंज़म

8

यह पहला तत्व पकड़ लेता है, इसे सरणी से हटा देता है, और हटाए गए तत्व को वापस करता है। यह मूल रूप से एक सरणी को स्टैक की तरह व्यवहार करने का एक तरीका है: shiftपॉप है, unshiftपुश है।


8
अच्छी तरह से शिफ्ट और अनशिफ्ट पॉप और पुश के समान हैं , सिवाय इसके कि वे किसी सरणी की शुरुआत से अंत के बजाय सामान जोड़ते और हटाते हैं।
अल्बर्टो सैन्टिनी

2
यह उत्तर अमूर्तता के सही स्तर पर है।
स्टीवन सुदित

@ अलबर्टो: या, दूसरे शब्दों में, वे सामने वाले को सबसे ऊपर मानते हैं। अन्यथा होने की कोई आवश्यकता नहीं है।
स्टीवन सुदित

5
मैं सिर्फ इशारा कर रहा था कि, चूंकि popऔर विधि pushभी Arrayहै, भ्रम की स्थिति नहीं है। :-)
अल्बर्टो सैन्टिनी

3
@ अलबर्टो: यह वास्तव में एक अच्छा बिंदु है। शिफ्ट / अनशिफ्ट मेथड्स फ्रंट को ऊपर की तरह इस्तेमाल करते हैं जबकि पुश / पॉप मेथड्स टॉप की तरह एंड का इस्तेमाल करते हैं। वे दोनों सरणी को एक स्टैक के रूप में मानते हैं, केवल अलग-अलग होते हैं जिसमें वे उपयोग करते हैं।
स्टीवन सुदित

2

यदि आप सरणी को संसाधित किए जाने वाले मानों की कतार के रूप में सोच सकते हैं, तो आप उपलब्ध किए गए स्थान पर कब्जा करने के लिए अगला (सामने) मान और अन्य मूल्य पर "बदलाव" कर सकते हैं। unshift मानों को वापस रखता है - शायद आप उनमें से कुछ को संसाधित करने के लिए तैयार नहीं हैं, या कुछ बाद के कोड को उन्हें संभालने देंगे।


1

यह सरणी का पहला तत्व लौटाता है, और इसे तत्वों से हटाता है, तत्वों को वापस एक स्थान पर स्थानांतरित करता है।

तो शिफ्टिंग [1,2,3,4,5]

रिटर्न 1, और होने के लिए सरणी सेट करता है [2,3,4,5]

अधिक यहाँ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.