2010-01-12 5 views
11

मैं 2 डी सरणी के स्थान पर एक संग्रह का उपयोग करना चाहता हूं ताकि मुझे घोषणा के समय अपना आकार देने की आवश्यकता न हो और मैं गतिशील रूप से जितने तत्वों को जोड़ सकूं।जावा में 2 डी सरणी के बजाय किस संग्रह का उपयोग करना है?

+1

सरणी में तत्वों तक पहुंचने के लिए आप किन पैटर्न का उपयोग करने जा रहे हैं? रैंडम एक्सेस, एक संपूर्ण पंक्ति, एक संपूर्ण कॉलम? –

उत्तर

7

सूची के साथ समस्या> यदि आप अपने मैट्रिक्स को 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 पैदा हैश-कोड के लिए एक महान उपकरण है।

+1

आपका हैशकोड ओवरफ़्लो हो सकता है - हालांकि आपने * इसके बाद * टिप्पणी की है ... :) – Esko

+0

तीव्र दृश्य !!! एक उपयोगिता विधि है: java.util.Arrays.hashCode (int []) जो एक int [] के लिए हैशकोड बनाता है लेकिन निश्चित रूप से, हैशचोड की आवश्यकता होने पर हर बार एक सरणी बनाना अच्छा नहीं होगा (या इसने बनाया)। शायद हम केवल दो पूर्णांक के लिए इसके कार्यान्वयन की प्रतिलिपि बना सकते हैं: (31 + o.x) * 31 + o.y. लेकिन ऐसा लगता है कि वैसे भी बहती है ... (मुझे लगता है कि इससे कोई फर्क नहीं पड़ता, क्या यह चक्रीय है?)। – helios

+0

क्या यह हैशकोड() में कोई फर्क पड़ता है कि x + y == y + x? – Adam

0

मैं व्यक्तिगत रूप से Vector कक्षा का उपयोग उस उद्देश्य के लिए कर रहा हूं, हालांकि विभिन्न आवश्यकताओं अंततः अन्य, अधिक विशिष्ट वर्गों के उपयोग को निर्देशित कर सकती हैं।

+0

वेक्टर बहुत ज्यादा बहिष्कृत है और इसे ArrayList द्वारा प्रतिस्थापित किया गया है। – Yoni

+2

@ मॉर्टिज - 'java.util.Vector' को आम तौर पर टाला जाना चाहिए - इसकी थ्रेड सुरक्षा अधिकांश बहु-थ्रेडेड परिदृश्यों के लिए बहुत उपयोगी नहीं है और केवल एकल-थ्रेडेड उपयोग के लिए ओवरहेड जोड़ती है। अधिकांश लोग 'ArrayList' को इसके बजाय' डिफ़ॉल्ट 'सूची प्रकार के रूप में उपयोग करते हैं। – McDowell

+0

कुछ सीखा, धन्यवाद! – moritz

0

java.util.ArrayList मेरी पसंदीदा पसंद है।

http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

+0

मुझे लगता है कि जब हम गतिशील 1-डी सरणी –

+0

रखना चाहते हैं तो इसका उपयोग किया जाता है आपके पास एक ऐरेलिस्ट हो सकता है कि उसका प्रत्येक तत्व एक और ऐरेलिस्ट होगा (जैसा कि आरएसपी और मैं हमारे उत्तरों में प्रस्तावित कर रहा हूं)। इस तरह, एक ArrayList भी 2 डी arrays के लिए इस्तेमाल किया जा सकता है। – Alex

0

आयात 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>> जो वास्तव में नहीं होता था '

2

सबसे आसान तरीका है ... कहते हैं List<List<String>> जो तब इस तरह इस्तेमाल किया जा सकता है (आपके मान स्ट्रिंग्स हैं यह सोचते हैं) नेस्टेड संग्रह का उपयोग करने के लिए है इस संदर्भ में समझ में नहीं आता है।

हालांकि, आप देख सकते हैं कि Google Collections या Apache Commons Collections कुछ और विशिष्ट है जो आप उपयोग कर सकते हैं।

0

यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन मैं ऐरेलिस्ट की सिफारिश करूंगा। यह वेक्टर से तेज है। जब तक आप सिंक्रनाइज़ेशन की परवाह नहीं करते! यदि आप इसे 2-आयामी सूची के रूप में चाहते हैं, तो आप एक ArrayList बनाते हैं और इस सूची का प्रत्येक तत्व एक और ArrayList होगा।

0

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

2

आप इसके साथ क्या करने में सक्षम होना चाहते हैं? मैं शायद Collection<Collection<Element>> (जहां संग्रह सूची द्वारा प्रतिस्थापित किया जा सकता है) का उपयोग करें।

या आप पंक्तियों या स्तंभों या आवश्यकतानुसार सभी तत्वों को फिर से चलाने के लिए मेटोड के साथ अपनी खुद की कक्षा बना सकते हैं।

0

यह डेटा संरचना का उपयोग करने के तरीके पर निर्भर करता है। आपके विकल्प हैं:

  • दो सूचियां; यह उनके बीच सिंक्रनाइज़ करने के लिए आपका काम है।
  • एक मानचित्र; एक महत्वपूर्ण मूल्य संबंध के बजाय, आपकी नक्शा प्रविष्टियां केवल वस्तुओं के tuples हो जाएगा।
  • 2-सेल ऑब्जेक्ट सरणी की एक सूची; सूची में प्रत्येक आइटम आकार की एक वस्तु सरणी हो जाएगा 2.

संपादित करें: मैं पूरी तरह से प्रश्न पढ़ने में भूलना; मैंने सोचा कि यह चौड़ाई 2 डी सरणी के बारे में था।

सही ढंग से प्रश्न पढ़ने के बाद (मुझे उम्मीद है :-)), मैं उन लोगों से सहमत हूं जिन्होंने सूची-सूची सूचीबद्ध की है।

संबंधित मुद्दे