स्कूलों को सूची पर सरणियाँ क्यों सिखाते हैं? [बन्द है]


36

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

चूंकि अधिकांश विश्वविद्यालय जावा को पढ़ाते हैं, इसलिए यह प्रश्न जावा के लिए विशिष्ट है।


7
ऐरे अधिक मौलिक हैं।
user253751

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
वर्ल्ड इंजीनियर

जवाबों:


120

क्योंकि सरणियाँ अनुक्रमण और सीमा जैसी अवधारणाओं को सिखाती हैं, कंप्यूटर प्रोग्रामिंग में दो मूलभूत रूप से महत्वपूर्ण अवधारणाएँ हैं।

सूचियाँ "मानक" नहीं हैं । समस्या की एक विस्तृत विविधता है जिसके लिए सरणियाँ एक आदर्श फिट हैं।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
वर्ल्ड इंजीनियर

48

वे शायद डेटा संरचना के साथ शुरू करना चाहते थे जो सबसे सटीक रूप से दर्शाता है कि कंप्यूटर कैसे काम करता है, इसलिए सूचियों जैसे उच्च-स्तरीय अमूर्त को शुरू करने से पहले आप बुनियादी बातों से परिचित हो जाते हैं जिससे काम करना आसान हो जाता है। अन्यथा आपके पास यह समझने का कोई तरीका नहीं है कि एक निश्चित संरचना या एल्गोरिथ्म कुछ कार्यों के लिए धीमा / तेज़ है और अन्य नहीं; अगर कंप्यूटर मेमोरी को वास्तव में लिंक्ड लिस्ट से बाहर कर दिया जाता तो दुनिया बहुत अलग जगह होती।

उसी कारण से, कॉलेज में मेरी पहली प्रोग्रामिंग क्लास सी में थी, और बाकी सभी कक्षाएं सी ++, जावा और अन्य भाषाओं में थीं। ऐसा नहीं है कि सी किसी तरह बेहतर या आसान है, यह है कि सी (और एरे) आपसे कुछ भी नहीं छुपाता है।


7
एक सूची वास्तविक कोड के साथ काम करना आसान है, लेकिन एक सरणी (पूरी तरह से) समझना आसान है, और समझने के लिए और अधिक महत्वपूर्ण है क्योंकि वे मौलिक और सार्वभौमिक हैं, जबकि (जावा की) सूची नहीं है। कम से कम मेरी यही राय है।
Ixrec

21
एक असाइनमेंट जिसमें आप किसी ऐरे में सामान स्टोर करते हैं और इसे बाद में एक्सेस करते हैं एक डेटा स्ट्रक्चर असाइनमेंट है । आपको अभी इसका एहसास नहीं हुआ होगा। आपको खुद से पूछना होगा कि बेहतर कम्प्यूटर्स का निर्माण क्या होता है, बुनियादी कम्प्यूटेशनल मॉडल को समझना या किसी भाषा के मानक पुस्तकालय को सीखना? सामान्य सहमति (और मैं मानता हूं, fwiw) यह है कि आप पहले संकलन की मूल बातें समझे बिना पुस्तकालय की बहुत सारी सामग्री को नहीं समझेंगे।
कैंट ए।

12
LinkedList, ArrayList, OrderedList, आदि आपको सबसे पहले कौन सी सूची सीखनी चाहिए? यदि आप यह नहीं समझते हैं कि वे पहली जगह में मौजूद क्यों हैं तो आप उनके लिए क्या करेंगे?
कैंट ए।

10
+1 से @KentAnderson। स्कूलों को उन इंजीनियरों का उत्पादन करना चाहिए जो निम्न स्तर पर डेटा संरचनाओं को समझते हैं; आदर्श रूप से, उत्पादक इंजीनियर जो आसानी से सी में बुनियादी संरचनाओं को लागू कर सकते हैं। कोई अन्य कार्यक्रम केवल एक जावास्कूल है।
क्रिश्चियन विलमैन

2
"वे शायद डेटा संरचना के साथ शुरू करना चाहते थे जो सबसे सटीक रूप से प्रतिनिधित्व करता है कि कंप्यूटर कैसे काम करता है" - तो, ​​सूची-संरचित या ऑब्जेक्ट-संरचित मेमोरी वाले कंप्यूटरों के बारे में क्या? "ऐसा नहीं है कि सी किसी तरह बेहतर या आसान है, यह है कि सी (और एरे) आपसे कुछ नहीं छुपाता है।" - जब तक आपके कंप्यूटर में पॉइंटर्स नहीं होते हैं, जैसे कि AS / 400, जहां C अनिवार्य रूप से VM में चलता है और आपके लिए बहुत कुछ छिपाता है ।
जोर्ग डब्ल्यू मित्तग

21

ऊपर दिए गए उत्तर बहुत अच्छे हैं, लेकिन मेरे मन में एक और बात है। जावा की main()विधि का मतलब है कि छात्रों को कक्षा के पहले दिन जैसे ही अक्सर बुनियादी सरणियों का सामना करना पड़ता है। क्यूं कर?

public static void main(String[] args)

हैलो वर्ल्ड और उससे परे लिखने के लिए आपको सबसे पहले यह करना होगा। (मैंने देखा है कि कुछ पाठ्यक्रम पहली बार में ब्लूज की तरह शिक्षण आईडीई का उपयोग करते हैं, जो आपको मनमाने तरीकों को चलाने के लिए पॉइंट-एंड-क्लिक करने की अनुमति देते हैं, लेकिन हम उन्हें अलग सेट कर देंगे ...) जबकि यह कुछ को सौंपने के लिए सार्थक हो सकता है थोड़ी देर के लिए ये कीवर्ड, जल्द या बाद में अधिकांश शिक्षक उन्हें समझाना चाहते हैं। दरअसल, एक क्लासिक शुरुआत-स्तरीय परीक्षण प्रश्न छात्रों को मूल हैलो वर्ल्ड प्रोग्राम में प्रत्येक कीवर्ड का अर्थ बताने के लिए कहता है। और हम अपने मुख्य विधि हस्ताक्षर के हिस्से के रूप में क्या पाते हैं? एक सरणी (उस का कारण, भाग में, ऐतिहासिक है। ArrayList जावा 1.0 में मौजूद नहीं था)। Arrays ज्ञान के उस मूल सेट का हिस्सा हैं। सूची नहीं है।

उस ने कहा, यह नहीं है कि कक्षाओं के लिए अर्रेइलिस्ट को थोड़ी देर बाद पाठ्यक्रम में पेश करना असामान्य है, विशेष रूप से एक बार वस्तुओं और उनके उपयोग को कवर किया गया है। यहां तक ​​कि जावा के लिए एपी कंप्यूटर विज्ञान पाठ्यक्रम में एरेइलिस्ट भी शामिल है (मुझे पता है कि इसका उपयोग किया गया था, और Google को यह इंगित करने के लिए लगता है कि यह अभी भी करता है), हालांकि यह इस तथ्य को नजरअंदाज करता है कि एरियर लिस्ट और बाकी के कलेक्शंस को लागू करता है।

अंत में, यह मेरा अनुभव है कि विश्वविद्यालय के सीएस प्रोग्राम जावा का उपयोग सीएस और प्रोग्रामिंग अवधारणाओं की खोज करने के लिए करते हैं, न कि छात्रों को अच्छे जावा डेवलपर्स कैसे बनें, यह सिखाने के लिए। कुछ कार्यक्रम पेशेवर डेवलपर्स को मंथन करने पर अधिक केंद्रित हो सकते हैं, जबकि अन्य सिद्धांत पर अधिक ध्यान केंद्रित करते हैं, लेकिन या तो मामले में, वास्तविक पेशेवर काम में जावा का उपयोग करने के तरीके के बारे में बहुत कुछ सीखना है जो अधिकांश कॉलेज पाठ्यक्रम में नहीं पढ़ाया जाएगा। यह प्रभावी पैटर्न में उन जैसी डिज़ाइन पैटर्न और तकनीकों से लेकर स्प्रिंग, हाइबरनेट या JUnit जैसी चौखटे या JSP या JDBC जैसी सामान्य चीज़ों तक भी है। उस दर्शन को ध्यान में रखते हुए, अधिक सामान्य रूप से उपयोग किए जाने वाले ArrayList पर सरणियों पर जोर देना थोड़ा अधिक समझ में आता है।


3
@ डेड्यूलेटर सुनिश्चित। यह सिर्फ सरणियों के बारे में मेरी बात के लिए प्रासंगिक नहीं था, इसलिए मैंने इसे छोड़ दिया। मैंने System.out.println ("हैलो वर्ल्ड!") को भी शामिल नहीं किया; या तो।
ज़च लिप्टन

"वास्तविक दुनिया" के लिए अवधारणाओं बनाम प्रभावी तकनीकों के लिए +1। कोई भी संस्करण नियंत्रण नहीं सिखा रहा था, कम से कम नहीं जब मैं स्कूल में था - लेकिन तब मैं प्राचीन हूं :)
डेविड

मैंने एक ऑपरेटिंग सिस्टम क्लास लिया, जहाँ हमें एक अनुसूचक की तरह विभिन्न टुकड़ों को लागू करना था; हमने एक समय (विशेष रूप से) पर एक ऐसे टुकड़े पर ध्यान केंद्रित किया क्योंकि उस बिंदु पर हम और अधिक करने में सक्षम नहीं थे । लेकिन एक ही समय में काम करने वाले उन सभी टुकड़ों को पाने की कोशिश करने के बारे में सोचकर मुझे "वास्तविक दुनिया" के विकास / "बड़े में प्रोग्रामिंग" की जटिलताओं की सराहना मिली।
डेविड

14

एक कारण यह है कि प्रथम वर्ष के प्रोग्रामिंग क्लासेस सरणियों का उपयोग करते हैं: यह इस प्रकार है कि प्राध्यापकों ने मूल रूप से इसे सीखा इससे पहले कि हमने डायनेमिक सूचियों के साथ मानक पुस्तकालयों का उपयोग करना शुरू कर दिया है। आदिम डेटा प्रकारों का उपयोग करना भी आम तौर पर लागू होता है: सरणियाँ बहुत अधिक कंप्यूटर में मौजूद हैं। सूर्य के तहत भाषा (और विधानसभा के निर्देश के एक मुट्ठी में लागू किया जा सकता है)। जब मैं पहली बार प्रोग्रामिंग सीख रहा था, एक लिंक्ड सूची को लागू करना असाइनमेंट्स में से एक था।

पहले सिद्धांतों से शुरू करना बहुत आसान है और फिर कहें कि "यह मूल संरचना है। यह भाषा (या इसकी लाइब्रेरी) आपको यह उच्च-स्तरीय डेटा संरचना प्रदान करती है, जो यह सब करती है, लेकिन आपको x, y और z प्रदान करती है," की तुलना में यह कहना है "तो ये उच्च स्तरीय डेटा संरचनाएं हैं, अब यहां क्या हो रहा है।" एक लिंक्डलिस्ट बनाम एक ऐरेलिस्ट (या हैशसेट बनाम एक ट्रीसेट) का उपयोग करने के कारण के बारे में सीखना आमतौर पर एक दूसरे या तीसरे वर्ष के एल्गोरिदम पाठ्यक्रम है। सूचियों और मानचित्रों में समान इंटरफेस होते हैं और समान परिणाम देते हैं, लेकिन किसी भी आकार के आवेदन में नाटकीय रूप से भिन्न व्यवहार हो सकते हैं। और एक बार जब आप प्रोग्रामिंग 101 से बाहर निकल जाते हैं, तो इस बात की कोई गारंटी नहीं है कि प्रोग्रामिंग 102 उसी भाषा का उपयोग करेगा। यदि आप किसी सरणी की अवधारणा से शुरू करते हैं, तो आप बस कह सकते हैं "

एक परिचयात्मक पाठ्यक्रम में "सूची" पर "सरणी" को पसंद करने का एक और कारण यह है कि सरणियों को मौलिक रूप से समझना आसान है: 20 की एक सरणी में bytes20 बाइट्स लगते हैं (साथ ही सरणी या लंबाई के अंत को इंगित करने के लिए एक युगल, कार्यान्वयन के आधार पर) )।

एक "सूची" मछली की एक पूरी तरह से अलग केतली है और इसे कई अलग-अलग तरीकों से लागू किया जा सकता है (ArrayList, LinkedList, और शायद एक युगल जो मैं भूल गया हूं), मौलिक रूप से अलग प्रदर्शन विशेषताओं के साथ। अलग सूची कक्षाएं क्या कर रहे हैं की हिम्मत को समझने के बिना, आप जब आप का उपयोग करना चाहिए की एक सार्थक चर्चा नहीं हो सकता List foo = new ArrayList()बनाम List foo = new LinkedList()। यदि आप छात्र को एक सूची कार्यान्वयन का उपयोग करने की कोशिश करते हैं, तो कोई यह पूछने जा रहा है कि आप अन्य कार्यान्वयन में से एक के बजाय ArrayList का उपयोग क्यों कर रहे हैं। और "ArrayList" में "Array" शब्द शामिल है और एक द्वारा समर्थित है, इसलिए यह वास्तव में "सरणी" से "ArrayList" के लिए एक विशाल तर्क नहीं है।

आम धारणा के विपरीत, ऐसी स्थितियाँ हैं जिनमें सूचियों पर सरणियों का उपयोग करना समझ में आता है, खासकर जब आप स्थिर आकार की सूची के साथ काम कर रहे हों। यहाँ एक जोड़े हैं:

  • लुक और यात्रा थोड़ा तेजी से कर रहे हैं क्योंकि आप विधि मंगलाचरण भूमि के ऊपर के साथ काम नहीं कर रहे हैं: foo[n]dereferences और कुछ परदे के पीछे गणित सूचक है, जबकि करता है foo.get(n)भिन्नता है,, एक विधि मंगलाचरण कर एक दूसरे भिन्नता हैं, और तब शायद सूचक अंकगणित करना (यदि आप एक ArrayList का उपयोग कर रहे हैं, LinkedLists संभावित रूप से सूची के प्रत्येक तत्व से पुनरावृत्त होने की आवश्यकता है)।
  • प्रारंभ में बहुत क्लीनर है: int[] foo = new int[]{1, 2, 3, 4, 5}बनाम एक और StackOverflow प्रश्न में सुझाव

एक अन्य परिदृश्य जब बड़े पैमाने पर बीट सरणियों को गिरफ्तार किया जाता है, जब अनुक्रम उपलब्ध हो जाता है जिसमें तत्व उस क्रम से मेल खाते हैं जिसमें उनके अंतिम स्थान ज्ञात हो जाएंगे, लेकिन अंतिम अनुक्रम से मेल नहीं खाता है। यदि permवह int[256]एक क्रमचय रखता है, तो कोई इसे आसानी से एक सरणी के साथ उलट सकता है: int[] inv = new int[256]; for (int i=0; i<256; i++) inv[perm[i]]=i; मुझे नहीं लगता कि कोई भी ऐसा लिख ArrayList<>सकता है जो साफ हो।
सुपरकैट

@supercat वास्तव में गतिशील सरणियों के साथ एक समस्या नहीं है, बस विशेष कार्यान्वयन; ArrayListआसानी से एक कंस्ट्रक्टर दिया जा सकता था जो एक निश्चित आकार की डिफ़ॉल्ट-प्रारंभिक सूची बनाता है।
डोभाल

क्या आपके पास यह दावा करने के लिए स्रोत हैं कि एक सरणी सूची को विधि आहरण ओवरहेड से निपटना है? सिद्धांत रूप में यह करता है, लेकिन व्यवहार में मैं आश्चर्यचकित होता हूं कि क्या getऔर setइनलेट नहीं मिलता है।
डोभाल

@ डोवाल: कोई कारण नहीं है कि अच्छी तरह से डिजाइन की गई भाषा / रूपरेखा एक गतिशील-सरणी प्रकार की आपूर्ति नहीं करनी चाहिए, जो आसानी से आइटम को अनुक्रम से जोड़ सकती है, लेकिन जावा इस तरह की आपूर्ति नहीं करता है।
सुपरकट

@ डोवाल: भले ही getऔर setलाइन में खड़ा किया जा सकता है, जैसे कुछ myList.set(23,myList.get(23)+1)भी उतना ही निकट नहीं होगा जितना कुशल myArray[23]+=1। इसके अलावा, यहां तक ​​कि उन प्रकारों के लिए भी जिन्हें मुक्केबाजी की आवश्यकता नहीं होगी, मुझे बहुत आश्चर्य होगा यदि कोई भी जेटर किसी भी चीज के बराबर हो सकता है for (i=0; i<1000; i++) myList2.set(i+2000,myList2.get(i+3000));जिसका प्रदर्शन कहीं भी हो, System.arrayCopy(myArray1,3000,myArray2,2000,1000); कोई कारण नहीं है कि फ्रेमवर्क के डायनामिक सरणी प्रकार को तेज कॉपी-रेंज ऑपरेशन की पेशकश नहीं करनी चाहिए, लेकिन जावा नहीं करता है।
सुपरकैट

7

जावा किसी भी प्रकार के चर को सरणियों में संग्रहीत करने की अनुमति देता है। इसके विपरीत, ArrayListकेवल संदर्भों के भंडारण की अनुमति देता है। इस प्रकार ArrayListपहले से कवर किए बिना उपयोगी चर्चा नहीं की जा सकती है कि ऑटो-बॉक्सिंग कैसे प्राइमिटिव को संदर्भ प्रकारों में बदल देगा, और कैसे ऑटो-अनबॉक्सिंग कभी - कभी संदर्भ प्रकारों को प्राइमेटिव में बदल देगा :

for (int i=10; i<=10000; i*=10)
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    l.add(i);
    l.add(i);
    l.add(l.get(0));
    System.out.print("i=" + i);
    System.out.print(" #0==i:" + (l.get(0)==i));
    System.out.print(" #1==i:" + (l.get(1)==i));
    System.out.print(" #2==i:" + (l.get(2)==i));
    System.out.print(" #0=#1:" + (l.get(0)==l.get(1)));
    System.out.print(" #1=#2:" + (l.get(1)==l.get(2)));
    System.out.println(" #0=#2:" + (l.get(0)==l.get(2)));
}

यदि कोड ने int[3]इसके बजाय एक का उपयोग किया था ArrayList, तो कोई आश्चर्य नहीं होगा। सभी तीन तत्व iएक दूसरे से बराबर और बराबर की तुलना करेंगे । उपयोग करना ArrayList, हालाँकि, भले ही सूची के सभी तीन तत्व हमेशा बराबर की तुलना करेंगे i, और पहले और तीसरे हमेशा एक दूसरे के बराबर की तुलना करेंगे, पहले दो तत्व केवल एक दूसरे के बराबर होंगे जब i1, 10, या 100, लेकिन (अधिकांश कार्यान्वयन पर) i1000 या 10000 नहीं है।


क्या आप बता सकते हैं कि # 1 और 10 या 100 होने पर # 0 और # 1 बराबर क्यों होंगे? मैंने उस बिंदु तक पीछा किया।
मैथ्यू

2
@MatthewRead: Integerवर्ग ने नेस्टेड क्लास कहा जाता है, IntegerCacheजो Integerमानों की एक सीमा के लिए पूर्व-प्रारंभिक ऑब्जेक्ट रखता है जो आमतौर पर -128..127 तक फैलता है; उस सीमा के बाहर एक मूल्य बॉक्सिंग के लिए एक नई वस्तु बनाने की आवश्यकता होगी, लेकिन कैश्ड रेंज के भीतर एक मूल्य को बॉक्सिंग करने से बस एक प्रारंभिक-प्रारंभिक ऑब्जेक्ट में संग्रहीत में से एक का संदर्भ वापस आ जाएगा IntegerCache.cache। किसी भी अच्छे जावा प्रोग्रामर को इस बात की जानकारी होनी चाहिए कि दो- Integerप्रकार के वैरिएबल एक ही मान को एनकैप्सुलेट करने वाले समान की तुलना कर सकते हैं या नहीं कर सकते हैं, लेकिन उस विचार को भी जल्दी लाने से छात्रों को आतंक में पलायन हो सकता है।
सुपरकैट

हुह, कभी अनुमान नहीं लगाया होगा कि यह पूर्व-अंकित वस्तुओं के कारण था। जानकारी के लिए धन्यवाद!
मैथ्यू पढ़ें

1
@MatthewRead: मैं चाहता हूं कि जावा ने कुछ विशेष प्रकार के अंतर्निहित रूपांतरण को अस्वीकार कर दिया है ==। इस संभावना को देखते हुए कि ऑटो-अनबॉक्सिंग फेंक सकता है, मैं इसे पूरी तरह से अस्वीकार करना चाहूंगा, लेकिन इसके साथ इसका व्यवहार ==विशेष रूप से भयानक है। ==ऑपरेटर भी तरह के मामलों में बुरी तरह बर्ताव करता है 16777217==16777216f[सच रिपोर्ट], और के लिए अंतर्निहित रूपांतरण long v=Math.Round(123456789), w=Math.Round(123456789012345)अप्रत्याशित हो करने के लिए उपयुक्त हैं [आप अनुमान लगा सकते हैं कि उन भाव निकलेगा?]
supercat

के रूप में IntegerCache, निश्चित रूप से ऐसे समय होते हैं जब यह प्रदर्शन में मदद कर सकता है, लेकिन यह अक्सर कोड का कारण बन सकता है जो थोड़े-से काम करने के लिए जस्ट प्लेन गलत है। कुछ मायनों में, मैं चाहता हूं कि एक ऐसी विधा थी जहां मुक्केबाजी दो पूर्णांक कैश से वस्तुओं को बेतरतीब ढंग से लौटाएगी और अर्ध-बेतरतीब ढंग से कैश आइटम को नए के साथ बदल देगी, ताकि कोड मान -128 के बॉक्सिंग व्यवहार पर निर्भर हो। बहुत लंबे समय तक सफल होने की संभावना नहीं है।
सुपरकैट

6

मुझे लगता है कि यह इस बात को सिखाने के लिए समझ में आता है कि ArrayListआंतरिक रूप से एक सरणी का उपयोग करने वाले तथ्य के कारण सबसे पहले सरणियों का उपयोग कैसे करें । ArrayListवर्ग कहा जाता है एक सदस्य चर है elementDataजो एक है Objectसरणी।

JDK ArrayList स्रोत कोड से :

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

जब आप ArrayListइसमें से तत्वों को जोड़ते हैं, अपडेट करते हैं, पुनः प्राप्त करते हैं या हटाते हैं, तो वे उन कार्यों को करने के लिए इस आंतरिक सरणी का उपयोग करते हैं। जैसा कि उपयोगकर्ता Ixrec ने पहले ही बताया है - ArrayListबस एक उच्च-स्तरीय अमूर्त है, जिसके साथ काम करना आम तौर पर आसान है।


लेकिन एक सरणी आंतरिक रूप से मेमोरी के एक ब्लॉक के लिए एक पॉइंटर का उपयोग करती है। अमूर्तता के उस विशिष्ट स्तर पर क्यों शुरू करें?

इस प्रश्न को टैग किया गया है Java- यह पूछ रहा था कि आम तौर पर जब आप उपयोग कर सकते हैं तो सरणियाँ क्यों सिखाएँ ArrayList। जावा में संकेत नहीं हैं। सही या गलत, मेरी राय है कि जावा की तुलना में छात्रों को शुरू करने के लिए C / C ++ एक बेहतर भाषा है। प्रोग्रामिंग में कई विषयों को C / C ++ का ज्ञान होने से बेहतर समझा जा सकता है।
डेरेक डब्ल्यू

3

यह मानते हुए कि सूची वास्तव में आपके साथ काम करने में आसान है, जैसा कि आप कहते हैं - यह वास्तव में मायने नहीं रखता है। सीखना "आसान से कठिन" की तुलना में "बुनियादी से जटिल" के बारे में अधिक है। अगर फंडामेंटल महत्वपूर्ण नहीं थे, तो कंप्यूटर विज्ञान एक अकादमिक क्षेत्र नहीं होगा। आप बस सीख सकते हैं कि ऑनलाइन ट्यूटोरियल से मौजूदा चौखटे / पुस्तकालयों का उपयोग करके एक साथ ऐप कैसे क्लिक करें। (बेशक, किसी को उन पुस्तकालयों को लिखना होगा ... और किसी को ArrayListपहली जगह में लागू करना होगा ...)


कई मामलों में जिनका उपयोग ArrayListअलग सरणी और "liveItems" गिनती का उपयोग करके बेहतर तरीके से किया जा सकता है, सिवाय इसके कि सरणी के साथ काम करने और उन्हें एकत्र करके छोड़कर एक साथ गणना करने का कोई सुविधाजनक तरीका नहीं है।
सुपरकैट

2

यह इसलिए है क्योंकि अकादमिक शिक्षा में सबसे महत्वपूर्ण बात यह है कि आप जो कुछ भी करते हैं उसका वर्णन करने के लिए सही शब्दावली का उपयोग करना सिखाएं।

सूची कुछ और है जो सरणी है। और आप java.util.Listजावा में उपयोग नहीं कर सकते क्योंकि यह एक इंटरफ़ेस है। आप आमतौर पर java.util.ArrayListसूची कार्यान्वयन का उपयोग करते हैं , यह सूची नहीं है, लेकिन गतिशील सरणी के आसपास एक ऑब्जेक्ट आवरण है। तो आप कहते हैं कि आप एक 'सूची' का उपयोग करते हैं, लेकिन आप एक सरणी का उपयोग करते हैं।

उस पारिभाषिक अव्यवस्था को छोड़ना बहुत उचित है और छात्रों को यह जानने के लिए कि ऐरे का उपयोग करें। यदि आप जावा में सरणियों का उपयोग करते हैं, तो कम से कम आप सरणियों का उपयोग करते हैं।

ईमानदारी से, यह भी तर्क है कि जावा के साथ प्रोग्रामिंग को पढ़ाना एक अच्छा विचार क्यों नहीं है। प्रोग्रामिंग की मूल अवधारणाओं को सही ढंग से सीखना कठिन है।


हैशमैप के बारे में क्या? एक सरणी महज एक प्रकार का हैशमैप है, एक तरह से ..
थुफ़िर

@ तुफिर कैसे एक सरणी हैशमैप हो सकता है? वे पूरी तरह से अलग डेटा संरचनाएं हैं।
डेन्यूबियन नाविक

आप हैशमैप के साथ एक सरणी का प्रतिनिधित्व कर सकते हैं। कौन सा अधिक "मौलिक" है? मेरा तर्क है कि हैशमैप अधिक वैचारिक रूप से दिलचस्प है।
थूफ़िर

1
@ तुफिर नहीं, तुम नहीं कर सकते। आप केवल अनुकरण कर सकते हैं। आंतरिक रूप से प्रत्येक डेटा संरचना वह होगी जो यह है। वे मौलिक और वैचारिक रूप से अलग चीजें हैं। यही कारण है कि जावा या जावास्क्रिप्ट जैसी अत्यधिक अमूर्त भाषाओं के साथ प्रोग्रामिंग सीखना शुरू करना बुरा है। यह स्पष्ट नहीं है कि डेटा संरचनाएं वास्तव में क्या हैं।
डेन्यूबियन नाविक

1

आपने सचमुच कभी कोई ऐरे नहीं देखा या इस्तेमाल नहीं किया? हम सूचियों के अलावा , हर समय उनका उपयोग करते हैं । हम आम तौर पर जावा का उपयोग नहीं करते हैं, लेकिन हम स्पष्ट समानताएं खींचने वाली अन्य भाषाओं का भरपूर उपयोग करते हैं।

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

और हाँ, एक शैक्षिक दृष्टिकोण से, छात्रों को मूल बातें सिखाने का अतिरिक्त कारण है। हालाँकि यह थोड़ा गहरा है। Arrays और Lists बल्कियर प्रकारों का एक अच्छा उदाहरण हैं जो अक्सर केवल शीर्ष पर बनाया जाता है, और अक्सर बस चारों ओर लपेटता है, लाइटर-वेट प्रकारों के अंतर्निहित उदाहरण। यहां तक ​​कि जब सूचियों में अंतर्निहित सरणियां नहीं होती हैं, तो वे बाहर की तरह व्यवहार करते हैं। किसी को पढ़ाने का एक हिस्सा क्या सूची है उन्हें सिखाने के लिए कि एक सरणी क्या है।

मैं इसे शायद C ++ जैसी भाषा में हाथ से निकलते हुए देख सकता हूं, जहां मूल रूप से सरणियों को उनसे अधिक नहीं छीना जा सकता है, लेकिन उच्च-स्तरीय भाषाओं में, वे लगभग खुद को सूचीबद्ध करते हैं। यदि वे किसी दिए गए स्थिति में आपकी आवश्यकताओं के अनुरूप हैं, तो आपको कुछ और उपयोग करने की आवश्यकता क्यों होगी?


मैं यह नहीं कहूंगा कि एक सूची में "अधिक" कार्यक्षमता है, क्योंकि इसमें "अलग" कार्यक्षमता है। T[]किसी भी क्रम में आइटम को स्वीकार करने के लिए, गेट के ठीक बाहर एक नया तैयार होगा, जबकि ArrayList<T>आवश्यकता है कि आइटम को जोड़ा जाए, ताकि उन्हें संशोधित किया जा सके। A T[]वस्तुओं की एक मनमानी श्रेणी को दूसरे T[]अपेक्षाकृत तेज़ी से आकार देने वाली श्रेणी में कॉपी कर सकता है , जबकि ArrayList<T>एक सूची से अलग-अलग आइटम को पढ़ना होगा और उन्हें दूसरे को संग्रहीत करना होगा - बहुत धीमा और कम सुविधाजनक।
सुपरकाट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.