मैं 2 डी सरणी के स्थान पर एक संग्रह का उपयोग करना चाहता हूं ताकि मुझे घोषणा के समय अपना आकार देने की आवश्यकता न हो और मैं गतिशील रूप से जितने तत्वों को जोड़ सकूं।जावा में 2 डी सरणी के बजाय किस संग्रह का उपयोग करना है?
उत्तर
सूची के साथ समस्या> यदि आप अपने मैट्रिक्स को redimension करना चाहते हैं तो आपको प्रत्येक पंक्ति को फिर से कम करना होगा।
आप एक विरल मैट्रिक्स, या हो सकता है एक अनंत मैट्रिक्स आप की तरह कुछ कर सकते हैं उपयोग करना चाहते हैं:
class SparseMatrix<X> {
private Map<Coord, X> values = new HashMap<Coord, X>();
public SparseMatrix() {
}
public X get(int x, int y) {
return values.put(new Coord(x,y)); // null if there's no value
}
public void set(int x, int y, X value) { // you can use null (like in a List)
values.set(new Coord(x,y), value);
}
private static class Coord {
int x; int y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if (other instance of Coord) {
Coord o = (Coord) other;
return o.x == x && o.y == y;
}
return false;
}
@Override
public int hashCode() {
return o.x + o.y; // or some more clever implementation :)
}
}
}
संपादित करें:Apache Commons HashCodeBuilder पैदा हैश-कोड के लिए एक महान उपकरण है।
आपका हैशकोड ओवरफ़्लो हो सकता है - हालांकि आपने * इसके बाद * टिप्पणी की है ... :) – Esko
तीव्र दृश्य !!! एक उपयोगिता विधि है: java.util.Arrays.hashCode (int []) जो एक int [] के लिए हैशकोड बनाता है लेकिन निश्चित रूप से, हैशचोड की आवश्यकता होने पर हर बार एक सरणी बनाना अच्छा नहीं होगा (या इसने बनाया)। शायद हम केवल दो पूर्णांक के लिए इसके कार्यान्वयन की प्रतिलिपि बना सकते हैं: (31 + o.x) * 31 + o.y. लेकिन ऐसा लगता है कि वैसे भी बहती है ... (मुझे लगता है कि इससे कोई फर्क नहीं पड़ता, क्या यह चक्रीय है?)। – helios
क्या यह हैशकोड() में कोई फर्क पड़ता है कि x + y == y + x? – Adam
मैं व्यक्तिगत रूप से Vector कक्षा का उपयोग उस उद्देश्य के लिए कर रहा हूं, हालांकि विभिन्न आवश्यकताओं अंततः अन्य, अधिक विशिष्ट वर्गों के उपयोग को निर्देशित कर सकती हैं।
वेक्टर बहुत ज्यादा बहिष्कृत है और इसे ArrayList द्वारा प्रतिस्थापित किया गया है। – Yoni
@ मॉर्टिज - 'java.util.Vector' को आम तौर पर टाला जाना चाहिए - इसकी थ्रेड सुरक्षा अधिकांश बहु-थ्रेडेड परिदृश्यों के लिए बहुत उपयोगी नहीं है और केवल एकल-थ्रेडेड उपयोग के लिए ओवरहेड जोड़ती है। अधिकांश लोग 'ArrayList' को इसके बजाय' डिफ़ॉल्ट 'सूची प्रकार के रूप में उपयोग करते हैं। – McDowell
कुछ सीखा, धन्यवाद! – moritz
java.util.ArrayList मेरी पसंदीदा पसंद है।
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
मुझे लगता है कि जब हम गतिशील 1-डी सरणी –
रखना चाहते हैं तो इसका उपयोग किया जाता है आपके पास एक ऐरेलिस्ट हो सकता है कि उसका प्रत्येक तत्व एक और ऐरेलिस्ट होगा (जैसा कि आरएसपी और मैं हमारे उत्तरों में प्रस्तावित कर रहा हूं)। इस तरह, एक ArrayList भी 2 डी arrays के लिए इस्तेमाल किया जा सकता है। – Alex
आयात java.util.ArrayList;
ArrayList
तुम क्या चाहते है, तो आप निर्माण के समय पर इसके आकार सेट करने की आवश्यकता नहीं है और आप गतिशील add
पद्धति का उपयोग करके तत्वों जोड़ सकते हैं।
List<List<String>> fakeArray = new ArrayList<List<String>>();
// Pretend you fill it with values between these calls
String retrieve = fakeArray.get(0).get(0);
संपादित करें:: यह मूल रूप से एक Map<String,List<String>>
जो वास्तव में नहीं होता था '
सबसे आसान तरीका है ... कहते हैं List<List<String>>
जो तब इस तरह इस्तेमाल किया जा सकता है (आपके मान स्ट्रिंग्स हैं यह सोचते हैं) नेस्टेड संग्रह का उपयोग करने के लिए है इस संदर्भ में समझ में नहीं आता है।
हालांकि, आप देख सकते हैं कि Google Collections या Apache Commons Collections कुछ और विशिष्ट है जो आप उपयोग कर सकते हैं।
यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन मैं ऐरेलिस्ट की सिफारिश करूंगा। यह वेक्टर से तेज है। जब तक आप सिंक्रनाइज़ेशन की परवाह नहीं करते! यदि आप इसे 2-आयामी सूची के रूप में चाहते हैं, तो आप एक ArrayList बनाते हैं और इस सूची का प्रत्येक तत्व एक और ArrayList होगा।
आप ArrayList
के साथ ArrayList
एस वाले आइटम के साथ परीक्षण कर सकते हैं। यदि वह वही नहीं करता जो आप चाहते हैं, तो यह आपको उस चीज में देगा जो आपको स्वयं को बनाने की जरूरत है।
आप इसके साथ क्या करने में सक्षम होना चाहते हैं? मैं शायद Collection<Collection<Element>>
(जहां संग्रह सूची द्वारा प्रतिस्थापित किया जा सकता है) का उपयोग करें।
या आप पंक्तियों या स्तंभों या आवश्यकतानुसार सभी तत्वों को फिर से चलाने के लिए मेटोड के साथ अपनी खुद की कक्षा बना सकते हैं।
यह डेटा संरचना का उपयोग करने के तरीके पर निर्भर करता है। आपके विकल्प हैं:
- दो सूचियां; यह उनके बीच सिंक्रनाइज़ करने के लिए आपका काम है।
- एक मानचित्र; एक महत्वपूर्ण मूल्य संबंध के बजाय, आपकी नक्शा प्रविष्टियां केवल वस्तुओं के tuples हो जाएगा।
- 2-सेल ऑब्जेक्ट सरणी की एक सूची; सूची में प्रत्येक आइटम आकार की एक वस्तु सरणी हो जाएगा 2.
संपादित करें: मैं पूरी तरह से प्रश्न पढ़ने में भूलना; मैंने सोचा कि यह चौड़ाई 2 डी सरणी के बारे में था।
सही ढंग से प्रश्न पढ़ने के बाद (मुझे उम्मीद है :-)), मैं उन लोगों से सहमत हूं जिन्होंने सूची-सूची सूचीबद्ध की है।
- 1. 2 डी सरणी
- 2. एक -1 डी सरणी के रूप में एक 2 डी सरणी का प्रतिनिधित्व
- 3. एक 2 डी सरणी
- 4. 2 डी सरणी
- 5. जावा में 2 मर्ज 2 संग्रह (1)
- 6. 2 डी सरणी
- 7. 2 डी सरणी C++
- 8. केवल 2 डी सरणी
- 9. 2 डी जावास्क्रिप्ट सरणी
- 10. 2 डी सरणी
- 11. 2 डी सरणी के साथ LINQ का उपयोग कर,
- 12. जावा में 2 डी सरणी के लिए डिजस्ट्रा एल्गोरिदम
- 13. घुमावदार 2 डी सरणी
- 14. एक 2 डी सरणी
- 15. 2 डी सरणी में तत्वों का उपयोग कैसे करें?
- 16. 2 डी सरणी अजगर
- 17. 2 डी सरणी
- 18. जेएस 2 डी सरणी
- 19. 2 डी सरणी
- 20. जावा 2 डी: ग्राफिक्स 2 डी
- 21. मुझे किस प्रकार का संग्रह उपयोग करना चाहिए?
- 22. डिजस्ट्रा का एल्गोरिदम एक 2 डी-सरणी
- 23. शून्य की 2 डी सरणी
- 24. सी #, घूर्णन 2 डी सरणी
- 25. 2 डी सरणी मान C++
- 26. सरल 2 डी सेल सरणी
- 27. numpy - 2 डी सरणी अनुक्रमण
- 28. 2 डी स्कैला सरणी पुनरावृत्ति
- 29. किस मामले में स्थिर कार्यों के बजाय कारखाने वर्गों का उपयोग करना समझ में आता है?
- 30. 1 डी सरणी सूचकांक 2 डी सरणी सूचकांक
सरणी में तत्वों तक पहुंचने के लिए आप किन पैटर्न का उपयोग करने जा रहे हैं? रैंडम एक्सेस, एक संपूर्ण पंक्ति, एक संपूर्ण कॉलम? –