मैं नीचे की तरह एक सरणी सूची बनाना चाहता हूं:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
लेकिन यह संकलन नहीं है। मैं यह कैसे कर सकता हूँ?
मैं नीचे की तरह एक सरणी सूची बनाना चाहता हूं:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
लेकिन यह संकलन नहीं है। मैं यह कैसे कर सकता हूँ?
जवाबों:
ओरेकल दस्तावेज़ के अनुसार :
"आप मानकीकृत प्रकारों के सरणियाँ नहीं बना सकते हैं"
इसके बजाय, आप कर सकते हैं:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
जैसा कि टॉम हेटिंग ने सुझाव दिया था - निपटने के लिए, यह करना बेहतर है:
List<List<Individual>> group = new ArrayList<List<Individual>>(4);
List<List<Individual>> group = new ArrayList<List<Individual>>();
शायद बेहतर होगा।
जैसा कि दूसरों ने उल्लेख किया है कि ArrayList को संग्रहीत करने के लिए किसी अन्य सूची का उपयोग करना बेहतर है, लेकिन अगर आपको किसी सरणी का उपयोग करना है:
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
ArrayList<String>[] group = new ArrayList[4]
) पर बेहतर होगा ? क्या अतिरिक्त अच्छा डो स्टी कास्ट करते हैं?
new ArrayList<?>[N]
कच्चे प्रकार का उपयोग करने से बचना चाहिए ।
यह काम:
ArrayList<String>[] group = new ArrayList[4];
ArrayList<String>
बजाय ArrayList<NotString>
) group
संकलन नहीं करता है
Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
आप ArrayList का विस्तार करने वाला एक वर्ग बना सकते हैं
class IndividualList extends ArrayList<Individual> {
}
और फिर सरणी बनाएँ
IndividualList[] group = new IndividualList[10];
मुझे पूरी तरह से यह नहीं मिलता है, क्यों हर कोई इस प्रश्न के लिए विशेष रूप से सरणी पर जीनिक प्रकार का सुझाव दे रहा है।
क्या होगा अगर मेरी ज़रूरत n
अलग-अलग सरणीवादियों को अनुक्रमित करने के लिए है ।
घोषित करने के साथ List<List<Integer>>
मुझे सूची n
ArrayList<Integer>
बनाने n
या किसी अन्य तरीके से मैन्युअल रूप से ऑब्जेक्ट बनाने या लूप लगाने की आवश्यकता है , किसी भी तरह से n
सूची बनाना हमेशा मेरा कर्तव्य होगा ।
अगर हम इसे कास्टिंग के माध्यम से घोषित करते हैं तो यह बहुत अच्छा नहीं है List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
। मैं इसे एक अच्छे डिजाइन के रूप में देखता हूं, जहां किसी को सभी इंडेक्सिंग ऑब्जेक्ट (एंज़लिस्ट) खुद बनाने की ज़रूरत नहीं है
क्या कोई मुझे बता सकता है कि यह (ख़राब) एक बुरा डिज़ाइन क्यों होगा और इसके नुकसान क्या हैं?
आप 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);
ArrayList::new
, तो यह ArrayList(int)
वर्तमान सूचकांक के तर्क को तर्क के रूप में कहेगा - एरेलेलिस्ट (1), एरेलेस्टिस्ट (2), एरेरीलिस्ट (3) आदि। इसलिए, आप या तो अंडर-आकार या ओवर-आकार सरणियों के साथ समाप्त हो जाएंगे, आपके उपयोग पर निर्भर करता है। मैं इसका उपयोग करने को हतोत्साहित करता हूं और इसके बजाय दूसरे दृष्टिकोण को प्राथमिकता देता हूं जहां आप अपने लंबोदर अभिव्यक्ति में खुद को निर्माता कहते हैं।
यह काम करता है, सरणी का सरणी। यह समझने की कोशिश करें कि यह कैसे काम करता है।
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]);
}
}
कुछ कोड के लिए केल्विनर को क्रेडिट।
इस स्थिति के साथ समस्या यह है कि आप एक विशिष्ट सूची में जोड़ने के लिए ओ (एन) की एक समय जटिलता प्राप्त एक सरणी सूची का उपयोग कर रहे हैं। यदि आप एक सरणी का उपयोग करते हैं तो आप अपने सरणी को घोषित करके एक मेमोरी स्थान बनाते हैं इसलिए यह स्थिर है
आप सामान्य प्रकार की सरणी नहीं बना सकते। ArrayLists की सूची बनाएँ:
List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();
या अगर आपको वास्तव में सरणी की जरूरत है (चेतावनी: खराब डिजाइन!):
ArrayList[] group = new ArrayList[4];
निर्माण और आरंभीकरण
Object[] yourArray = new Object[ARRAY_LENGTH];
पहुँच लिखिए
yourArray[i]= someArrayList;
आंतरिक ArrayList के तत्वों का उपयोग करने के लिए:
((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
पहुंच पढ़ें
सरणी तत्व i को एक ArrayList प्रकार की कास्टिंग के रूप में पढ़ने के लिए:
someElement= (ArrayList<YourType>) yourArray[i];
सरणी तत्व i के लिए: सूचकांक j पर ArrayList तत्व को पढ़ने के लिए
arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
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 का प्रतिनिधित्व करने के लिए एक सुरुचिपूर्ण समाधान होने के लिए पाया है।
ArrayList<Integer>[] graph = new ArrayList[numCourses]
यह काम करता हैं।
मुझे यह उपयोग करना आसान लगता है ...
static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
group=new ArrayList[size];
for(int i=0;i<size;i++)
{
group[i]=new ArrayList<Individual>();
}
तुम यह केर सकते हो :
// एक प्रकार का सरणी बनाएँ ArrayList
`ArrayList<Integer>[] a = new ArrayList[n];`
// सरणी में प्रत्येक तत्व के लिए एक ArrayList बनाते हैं
for(int i=0; i<n; i++){
a[i] = new ArrayList<Integer>();
}
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
al[i] = new ArrayList<String>();
}
आप एक सूची [] बना सकते हैं और उन्हें लूप के द्वारा आरंभ कर सकते हैं। यह त्रुटियों के बिना संकलित है:
List<e>[] l;
for(int i = 0; i < l.length; i++){
l[i] = new ArrayList<e>();
}
यह arrayList [] l के साथ भी काम करता है।
l.length
लूप में अपरिभाषित है। यह एक रनटाइम त्रुटि हो सकती है।