कैसे जावा में सारणियों की एक सरणी बनाने के लिए


115

Hypothetically, मेरे पास 5 स्ट्रिंग सरणी ऑब्जेक्ट हैं:

String[] array1 = new String[];
String[] array2 = new String[];
String[] array3 = new String[];
String[] array4 = new String[];
String[] array5 = new String[];

और मैं उन 5 स्ट्रिंग सरणी वस्तुओं को शामिल करने के लिए एक और सरणी ऑब्जेक्ट चाहता हूं। मैं यह कैसे करुं? क्या मैं इसे दूसरे सरणी में रख सकता हूं?


43
नॉब के सवाल गंभीर हो सकते हैं। वास्तव में, वे अक्सर होते हैं। :-)
टीजे क्राउडर

3
स्थायी प्रश्न, और उत्तर स्पष्ट नहीं है कि कौन जानता है कि मेमोरी संरेखण कैसे किया जाता है। +1
बेंज नं।

जवाबों:


153

ऐशे ही:

String[][] arrays = { array1, array2, array3, array4, array5 };

या

String[][] arrays = new String[][] { array1, array2, array3, array4, array5 };

(बाद वाले सिंटैक्स का उपयोग चर घोषणा के बिंदु के अलावा अन्य असाइनमेंट में किया जा सकता है, जबकि कम सिंटैक्स केवल घोषणाओं के साथ काम करता है।)


क्या आप आगे बता सकते हैं कि दूसरा सिंटैक्स क्या करता है? यह मेरे लिए अस्पष्ट है।
टेरेंस पोंस

4
@Terence: यह पहले की तरह ही करता है: यह एक सरणी स्ट्रिंग संदर्भों की एक सरणी बनाता है, मूल्यों array1, array2, array3, array4 और array5 के लिए तैयार किया जाता है - जिनमें से प्रत्येक अपने आप में एक स्ट्रिंग सरणी संदर्भ है।
जॉन स्कीट

1
त्वरित प्रश्न: मैं रन टाइम में यह कैसे करूंगा यदि मुझे पता नहीं है कि कितने ऐरे ऑब्जेक्ट बनाए जाएंगे?
टेरेंस पोंस

1
@ चेतावनी: क्या आप अधिक विशिष्ट उदाहरण दे सकते हैं? आप संकलन समय पर प्रारंभिक मान निर्दिष्ट कर रहे हैं, तो आप करते आकार पता है। क्या आपका मतलब कुछ ऐसा है new String[10][]?
जॉन स्कीट

हाँ। पतरस के जवाब के समान।
टेरेंस पोंस

71

प्रयत्न

String[][] arrays = new String[5][];

1
यह एक और अधिक लचीला है
hetaoblog

क्या आपको अपने सरणी पर एक निश्चित आकार निर्धारित नहीं करना चाहिए?
फिलीप

@ फ़िलिप यह तय है 5. अगले स्तर की स्थापना उन्हें पूर्व-आवंटित करती है लेकिन इसे बदला जा सकता है इसलिए यह सेटिंग उपयोगी नहीं हो सकती है।
पीटर लॉरी

8
मैं सरणी में डेटा कैसे डालूं? अगर इसका डायनामिक डेटा?
प्रखर मोहन श्रीवास्तव

1
@PrakharMohanSrivastava आप व्यक्तिगत रूप से तत्वों को सेट कर सकते हैं: arrays[0] = new String[] {"a", "b", "c"}या एक अस्थायी सूची का उपयोग कर सकते हैं : <पूर्व> <कोड> सूची <स्ट्रिंग []> myList = नया ArrayList <> (); myList.add (नया स्ट्रिंग [] {"a", "b", "c"}); myList.add (नया स्ट्रिंग [] {"d", "e", "f"}); myList.toArray (सरणियों); </ code> </ pre>
kntx

26

जबकि दो उत्कृष्ट उत्तर आपको बता रहे हैं कि यह कैसे करना है, मुझे लगता है कि एक और उत्तर गायब है: ज्यादातर मामलों में आपको यह बिल्कुल नहीं करना चाहिए।

Arrays बोझिल हैं, ज्यादातर मामलों में आप Collection API का उपयोग करना बेहतर समझते हैं

संग्रह के साथ, आप तत्वों को जोड़ सकते हैं और हटा सकते हैं और विभिन्न कार्यक्षमता (इंडेक्स-आधारित लुकअप, सॉर्टिंग, यूनीकनेस, FIFO-access, concurrency आदि) के लिए विशेष संग्रह हैं।

हालांकि यह Arrays और उनके उपयोग के बारे में जानने के लिए निश्चित रूप से अच्छा और महत्वपूर्ण है, अधिकांश मामलों में Collections का उपयोग करके APIs को बहुत अधिक प्रबंधनीय बनाते हैं (यही कारण है कि Google Guava जैसी नई लाइब्रेरी शायद ही कभी Arrays का उपयोग करें)।

इसलिए, आपके परिदृश्य के लिए, मैं सूची की सूची पसंद करूंगा, और मैं इसे अमरूद का उपयोग करके बनाऊंगा:

List<List<String>> listOfLists = Lists.newArrayList();
listOfLists.add(Lists.newArrayList("abc","def","ghi"));
listOfLists.add(Lists.newArrayList("jkl","mno","pqr"));

स्ट्रिंग [] [] की तुलना में थोड़ा अधिक जटिल है, लेकिन समवर्ती डेटा जैसे अधिक संचालन की अनुमति देता है। हालांकि, आपका समाधान डेटा के आकार को सुनिश्चित नहीं करता है, जो एक समस्या हो सकती है।
बेन्ज

1
@Benj यदि आवश्यक हो, तो हमेशा एक लिस्ट डेकोरेटर लिखना संभव है जो केवल एक निश्चित संख्या में आइटम स्वीकार करता है।
शॉन पैट्रिक फ्लोयड

सटीक, सज्जाकार / रैपर सुसंगतता सुनिश्चित करने का एक अच्छा तरीका है। इस प्रकार, हम जिस तरीके के बारे में बात कर रहे हैं वह सरल सरणियों की तुलना में कहीं अधिक जटिल है। मैंने जो किया है वह एक छोटी उपयोगिता वर्ग Array2D <T> है जो कुछ बुनियादी तरीकों जैसे कि एक्सिक्स (...) आदि को एनकैप्सलेट करता है। मैंने इसे नीचे पोस्ट किया है।
बेंज

6

उस वर्ग का उल्लेख है जिसका उल्लेख हमने शॉन पैट्रिक फ्लोयड के साथ किया था: मैंने इसे एक अजीबोगरीब उपयोग के साथ किया, जिसमें वीकेरप्रिंट की आवश्यकता होती है, लेकिन आप इसे किसी भी वस्तु द्वारा आसानी से बदल सकते हैं।

यह उम्मीद किसी दिन किसी की मदद कर सकते हैं :)

import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;


/**
 *
 * @author leBenj
 */
public class Array2DWeakRefsBuffered<T>
{
    private final WeakReference<T>[][] _array;
    private final Queue<T> _buffer;

    private final int _width;

    private final int _height;

    private final int _bufferSize;

    @SuppressWarnings( "unchecked" )
    public Array2DWeakRefsBuffered( int w , int h , int bufferSize )
    {
        _width = w;
        _height = h;
        _bufferSize = bufferSize;
        _array = new WeakReference[_width][_height];
        _buffer = new LinkedList<T>();
    }

    /**
     * Tests the existence of the encapsulated object
     * /!\ This DOES NOT ensure that the object will be available on next call !
     * @param x
     * @param y
     * @return
     * @throws IndexOutOfBoundsException
     */public boolean exists( int x , int y ) throws IndexOutOfBoundsException
    {
        if( x >= _width || x < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ x = " + x + "]" );
        }
        if( y >= _height || y < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ y = " + y + "]" );
        }
        if( _array[x][y] != null )
        {
            T elem = _array[x][y].get();
            if( elem != null )
            {
            return true;
            }
        }
        return false;
    }

    /**
     * Gets the encapsulated object
     * @param x
     * @param y
     * @return
     * @throws IndexOutOfBoundsException
     * @throws NoSuchElementException
     */
    public T get( int x , int y ) throws IndexOutOfBoundsException , NoSuchElementException
    {
        T retour = null;
        if( x >= _width || x < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ x = " + x + "]" );
        }
        if( y >= _height || y < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ y = " + y + "]" );
        }
        if( _array[x][y] != null )
        {
            retour = _array[x][y].get();
            if( retour == null )
            {
            throw new NoSuchElementException( "Dereferenced WeakReference element at [ " + x + " ; " + y + "]" );
            }
        }
        else
        {
            throw new NoSuchElementException( "No WeakReference element at [ " + x + " ; " + y + "]" );
        }
        return retour;
    }

    /**
     * Add/replace an object
     * @param o
     * @param x
     * @param y
     * @throws IndexOutOfBoundsException
     */
    public void set( T o , int x , int y ) throws IndexOutOfBoundsException
    {
        if( x >= _width || x < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (set) : [ x = " + x + "]" );
        }
        if( y >= _height || y < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (set) : [ y = " + y + "]" );
        }
        _array[x][y] = new WeakReference<T>( o );

        // store local "visible" references : avoids deletion, works in FIFO mode
        _buffer.add( o );
        if(_buffer.size() > _bufferSize)
        {
            _buffer.poll();
        }
    }

}

इसका उपयोग कैसे करें का उदाहरण:

// a 5x5 array, with at most 10 elements "bufferized" -> the last 10 elements will not be taken by GC process
Array2DWeakRefsBuffered<Image> myArray = new Array2DWeakRefsBuffered<Image>(5,5,10);
Image img = myArray.set(anImage,0,0);
if(myArray.exists(3,3))
{
    System.out.println("Image at 3,3 is still in memory");
}

4
आपके प्रयास के लिए +1, लेकिन: अपने इंट-फ़ील्ड को -1 से प्रारंभ करने और उन्हें कन्स्ट्रक्टर में पुनः असाइन करने के बजाय, आपको उन्हें अंतिम बनाना चाहिए और उन्हें केवल कंस्ट्रक्टर में असाइन करना चाहिए ।
सीन पैट्रिक फ्लोयड

1
@Sean: मैं कोड को संशोधित (के साथ "नहीं-जीसी बफ़र" नया एक पोस्ट, अपने बुद्धिमान टिप्पणी भी शामिल है।
Benj
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.