ऐरेलेस्ट का एक सरणी बनाएँ


175

मैं नीचे की तरह एक सरणी सूची बनाना चाहता हूं:

ArrayList<Individual>[] group = new ArrayList<Individual>()[4]

लेकिन यह संकलन नहीं है। मैं यह कैसे कर सकता हूँ?


8
सरणियों और संग्रह मिश्रण मत करो। वास्तव में, सरणियों का उपयोग न करें जब तक कि आप आदिम से व्यवहार नहीं कर रहे हैं (या आप जानते हैं कि आप क्या कर रहे हैं)। ऐरे एक प्रयोज्य दुःस्वप्न हैं, वे आपके कोड को अचूक बनाते हैं।
सीन पैट्रिक फ़्लॉइड

13
@SeanPatrickFloyd क्या आप बता सकते हैं कि सरणियाँ प्रयोज्य दुःस्वप्न क्यों हैं?
उपयोगकर्ता

3
@crucifiedsoul यकीन है। एक सरणी नहीं बढ़ सकती है, आप किसी भी चीज़ को एक सरणी में सम्मिलित नहीं कर सकते हैं, एक सरणी मानक विधियों जैसे हैशकोड या स्टर्लिंग आदि को ओवरराइड नहीं करता है
सीन पैट्रिक फ्लोयड

9
@SeanPatrickFloyd ठीक है - अच्छी तरह से मुझे बिल्कुल चार व्यूहकारों की ज़रूरत है - मैं हर एक को इंडेक्स द्वारा एक्सेस करने की योजना बनाता हूं - मुझे बढ़ने या सिकुड़ने के लिए बाहरी सरणी की आवश्यकता नहीं है - मुझे किसी भी स्ट्रिंग या हैशकोड, आदि की आवश्यकता नहीं है - - मेरे लिए, एक सरणी यहाँ स्पष्ट विकल्प है - इस स्थिति में एक विकल्प के रूप में आप क्या सिफारिश करेंगे?
BrainSlugs83 22

4
ठीक है, यह एक पुराना सवाल है, लेकिन मैं वैसे भी पूछने जा रहा हूं और देखता हूं कि कोई जवाब देता है या नहीं। मैं सभी को इस बारे में बात करते हुए देख रहा हूं कि सूचियों की एक सरणी एक भयानक विचार, खराब कोडिंग अभ्यास आदि क्यों है, मैंने इसे देखा क्योंकि मैं हैश चेन करना सीख रहा हूं, और हैश चेन की परिभाषा सूचियों की एक सरणी है! तो वास्तव में एक केंद्रीय प्रोग्रामिंग डेटा संरचना भयानक कोडिंग अभ्यास कैसे हो सकती है? या क्या यह सिर्फ @ सीन द्वारा उल्लिखित IYKWYD श्रेणी में आता है?
13

जवाबों:


142

ओरेकल दस्तावेज़ के अनुसार :

"आप मानकीकृत प्रकारों के सरणियाँ नहीं बना सकते हैं"

इसके बजाय, आप कर सकते हैं:

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);

जैसा कि टॉम हेटिंग ने सुझाव दिया था - निपटने के लिए, यह करना बेहतर है:

List<List<Individual>> group = new ArrayList<List<Individual>>(4);

20
List<List<Individual>> group = new ArrayList<List<Individual>>();शायद बेहतर होगा।
टॉम हॉल्टिन

4
"सामान्य प्रकार का एक सरणी नहीं बना सकता है" क्या मतलब है? यह वास्तव में मेरे लिए कोई मतलब नहीं है क्योंकि यह एक सामान्य नहीं है यदि आप प्रदान करते हैं कि क्या इसके धारण करने के लिए सही है?
एंडी

5
मुझे इस बात का आश्चर्य है कि यह सवाल का जवाब नहीं देता (यानी मैं यह करना चाहता हूं, मैं यह कैसे कर सकता हूं)। शायद 1 वाक्य के अलावा।
फ्लोरियन एफ

15
ArrayList की तुलना में सूची संदर्भ बेहतर क्यों है?
शिफू

3
@shifu एक सूची संदर्भ ArrayList की तुलना में अधिक सामान्य है; सूची सार के रूप में घोषित करने वाले एरेलेस्ट के एपीआई को दूर करते हैं जो सूची एपीआई से परे फैली हुई है। यह अच्छा है क्योंकि यह सूची के संदर्भ को सरल बनाता है जिसका एपीआई संभवत: संपूर्णता के साथ सूची के एपीआई के साथ एट्रैसिस्ट के पास उस संदर्भ की एपीआई को अव्यवस्थित किए बिना सूची के लिए क्या आवश्यक है। यदि आपको संदर्भ के माध्यम से उपलब्ध होने के लिए इसके एपीआई से कुछ विशिष्ट चाहिए तो आपको केवल ArrayList घोषित करना चाहिए।
cellepo

98

जैसा कि दूसरों ने उल्लेख किया है कि ArrayList को संग्रहीत करने के लिए किसी अन्य सूची का उपयोग करना बेहतर है, लेकिन अगर आपको किसी सरणी का उपयोग करना है:

ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

4
कोई भी यह अच्छी तरह से समझाता नहीं है कि मुझे ऊपर और आपके स्निपेट क्यों पसंद हैं। आप इस पर सूची का उपयोग करने की सलाह क्यों देते हैं?
clankill3r

3
यदि सरणी समूह नहीं बदलता है, तो यह दृष्टिकोण बेहतर है, क्योंकि सरणियाँ सूची <> कक्षाओं की तुलना में तेज़ हैं।
बोरझ जू

33
वास्तव में सवाल का जवाब देने के लिए धन्यवाद। किसी संदर्भ को बिना किसी संदर्भ के किसी सरणी के लिए स्वचालित रूप से मान लेना कोई तार्किक कारण नहीं है।
स्पेशल सॉस

3
किसी भी कारण से यह @kelvincer उत्तर ( ArrayList<String>[] group = new ArrayList[4]) पर बेहतर होगा ? क्या अतिरिक्त अच्छा डो स्टी कास्ट करते हैं?
cellepo

2
आपको new ArrayList<?>[N]कच्चे प्रकार का उपयोग करने से बचना चाहिए ।
रेडियोडेफ

80

यह काम:

ArrayList<String>[] group = new ArrayList[4];

1
यह संतोषजनक रूप से वांछित लाभ है कि स्ट्रिंग के अलावा किसी भी वस्तु के एक ArrayList को जोड़ना (यानी: के ArrayList<String>बजाय ArrayList<NotString>) groupसंकलन नहीं करता है
cellepo

12
यह एक चेतावनी उत्पन्न करता है:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
गणित

24

आप ArrayList का विस्तार करने वाला एक वर्ग बना सकते हैं

class IndividualList extends ArrayList<Individual> {

}

और फिर सरणी बनाएँ

IndividualList[] group = new IndividualList[10];

17

मुझे पूरी तरह से यह नहीं मिलता है, क्यों हर कोई इस प्रश्न के लिए विशेष रूप से सरणी पर जीनिक प्रकार का सुझाव दे रहा है।

क्या होगा अगर मेरी ज़रूरत nअलग-अलग सरणीवादियों को अनुक्रमित करने के लिए है ।

घोषित करने के साथ List<List<Integer>>मुझे सूची n ArrayList<Integer>बनाने nया किसी अन्य तरीके से मैन्युअल रूप से ऑब्जेक्ट बनाने या लूप लगाने की आवश्यकता है , किसी भी तरह से nसूची बनाना हमेशा मेरा कर्तव्य होगा ।

अगर हम इसे कास्टिंग के माध्यम से घोषित करते हैं तो यह बहुत अच्छा नहीं है List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]। मैं इसे एक अच्छे डिजाइन के रूप में देखता हूं, जहां किसी को सभी इंडेक्सिंग ऑब्जेक्ट (एंज़लिस्ट) खुद बनाने की ज़रूरत नहीं है

क्या कोई मुझे बता सकता है कि यह (ख़राब) एक बुरा डिज़ाइन क्यों होगा और इसके नुकसान क्या हैं?


AFAICT यह एक प्रकार की कार्गो पंथ मानसिकता है जो भयानक टाइपिंग प्रणाली से प्रेरित है जिसे जावा तालिका में लाता है।
BrainSlugs83

@smsIce: यह एक बुरा डिज़ाइन नहीं है। समस्या यह है, कि कई लेखक पूरा प्रश्न नहीं पढ़ते हैं या इसे स्पष्ट रूप से नहीं समझते हैं।
Testo

16

आप ArrayList का Array बना सकते हैं

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}

यह इस तरह से परिदृश्यों में सहायक होगा। आप बाहरी के आकार को जानते हैं। लेकिन भीतर का आकार भिन्न होता है। यहां आप निश्चित लंबाई की एक सरणी बना सकते हैं जिसमें आकार-भिन्न सरणी सूची होती है। आशा है कि यह आपके लिए सहायक होगा।

में जावा 8 और इसके बाद के संस्करण आप एक बेहतर तरीके से कर सकते हैं।

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());

विधि संदर्भ का उपयोग करते हुए और भी बेहतर

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);

2
जब आप इसका उपयोग करते हैं ArrayList::new, तो यह ArrayList(int)वर्तमान सूचकांक के तर्क को तर्क के रूप में कहेगा - एरेलेलिस्ट (1), एरेलेस्टिस्ट (2), एरेरीलिस्ट (3) आदि। इसलिए, आप या तो अंडर-आकार या ओवर-आकार सरणियों के साथ समाप्त हो जाएंगे, आपके उपयोग पर निर्भर करता है। मैं इसका उपयोग करने को हतोत्साहित करता हूं और इसके बजाय दूसरे दृष्टिकोण को प्राथमिकता देता हूं जहां आप अपने लंबोदर अभिव्यक्ति में खुद को निर्माता कहते हैं।
जिनीस

8

यह काम करता है, सरणी का सरणी। यह समझने की कोशिश करें कि यह कैसे काम करता है।

import java.util.*;

public class ArrayOfArrayList {
    public static void main(String[] args) {

        // Put the length of the array you need
        ArrayList<String>[] group = new ArrayList[15];
        for (int x = 0; x < group.length; x++) {
            group[x] = new ArrayList<>();
        }

        //Add some thing to first array
        group[0].add("Some");
        group[0].add("Code");

        //Add some thing to Secondarray
        group[1].add("In here");

        //Try to output 'em
        System.out.println(group[0]);
        System.out.println(group[1]);
    }
}

कुछ कोड के लिए केल्विनर को क्रेडिट।


6

इस स्थिति के साथ समस्या यह है कि आप एक विशिष्ट सूची में जोड़ने के लिए ओ (एन) की एक समय जटिलता प्राप्त एक सरणी सूची का उपयोग कर रहे हैं। यदि आप एक सरणी का उपयोग करते हैं तो आप अपने सरणी को घोषित करके एक मेमोरी स्थान बनाते हैं इसलिए यह स्थिर है


सरणी और ArrayList दोनों के लिए एक विशिष्ट स्थिति में O (n) जोड़ना है। दोनों सरणियों और ArrayList के लिए भरना O (n) भी है।
नवीन

2
सरणियों के लिए एक विशिष्ट स्थिति में जोड़ना हे (1) है। यह ArrayList के लिए O (n) है, लेकिन सरणियों के लिए O (1) है।
अवेमीत

3

आप सामान्य प्रकार की सरणी नहीं बना सकते। ArrayLists की सूची बनाएँ:

 List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();

या अगर आपको वास्तव में सरणी की जरूरत है (चेतावनी: खराब डिजाइन!):

 ArrayList[] group = new ArrayList[4];

2
  1. निर्माण और आरंभीकरण

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. पहुँच लिखिए

    yourArray[i]= someArrayList;

    आंतरिक ArrayList के तत्वों का उपयोग करने के लिए:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. पहुंच पढ़ें

    सरणी तत्व i को एक ArrayList प्रकार की कास्टिंग के रूप में पढ़ने के लिए:

    someElement= (ArrayList<YourType>) yourArray[i];

    सरणी तत्व i के लिए: सूचकांक j पर ArrayList तत्व को पढ़ने के लिए

    arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);

2

सूची [] listArr = नया एरियर सूची [4];

ऊपर की लाइन चेतावनी देती है, लेकिन यह काम करती है (यानी यह एरे के कलाकार को पैदा करती है)


1

ArrayLists की एक सरणी को वैधानिक रूप से घोषित करने के लिए, कहते हैं, स्थान को अंक के रूप में देखें:

ArrayList<Point>[] positionList = new ArrayList[2];

public Main(---) {
    positionList[0] = new ArrayList<Point>(); // Important, or you will get a NullPointerException at runtime
    positionList[1] = new ArrayList<Point>();
}

गतिशील:

ArrayList<Point>[] positionList;
int numberOfLists;

public Main(---) {
    numberOfLists = 2;
    positionList = new ArrayList[numberOfLists];
    for(int i = 0; i < numberOfLists; i++) {
        positionList[i] = new ArrayList<Point>();
    }
}

यहां सावधानी और कुछ जटिल सुझावों के बावजूद, मैंने ArrayLists की एक सरणी को उसी प्रकार के संबंधित ArrayLists का प्रतिनिधित्व करने के लिए एक सुरुचिपूर्ण समाधान होने के लिए पाया है।



1

आप इस तरह बना सकते हैं ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

आपको गैर जेनेरिक प्रकार की सरणी बनानी होगी और फिर इसे जेनेरिक में डालना होगा।



0

मुझे यह उपयोग करना आसान लगता है ...

static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
 group=new ArrayList[size];
 for(int i=0;i<size;i++)
 {
  group[i]=new ArrayList<Individual>();
 }

0

तुम यह केर सकते हो :

// एक प्रकार का सरणी बनाएँ ArrayList

`ArrayList<Integer>[] a = new ArrayList[n];`

// सरणी में प्रत्येक तत्व के लिए एक ArrayList बनाते हैं

for(int i=0; i<n; i++){ 
    a[i] = new ArrayList<Integer>();
}


-1

आप एक सूची [] बना सकते हैं और उन्हें लूप के द्वारा आरंभ कर सकते हैं। यह त्रुटियों के बिना संकलित है:

List<e>[] l;
for(int i = 0; i < l.length; i++){
    l[i] = new ArrayList<e>();
}

यह arrayList [] l के साथ भी काम करता है।


2
l.lengthलूप में अपरिभाषित है। यह एक रनटाइम त्रुटि हो सकती है।
bourbaki4481472

एल की लंबाई के लिए आरंभीकृत नहीं है, यह लूप के लिए पहुंचने पर अभी भी एक अशक्त सूचक है। सूची सूची <e> [] l = नई सूची [LENGTH];
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.