জাভাতে কীভাবে অ্যারে তৈরি করবেন make


115

হাইপোথিটিক্যালি, আমার কাছে 5 টি স্ট্রিং অ্যারে অবজেক্ট রয়েছে:

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

এবং আমি চাই যে আরও 5 টি স্ট্রিং অ্যারে বস্তু থাকতে পারে অন্য অ্যারে অবজেক্টটি। আমি এটা কিভাবে করব? আমি কি এটি অন্য অ্যারে রাখতে পারি?


43
নুব প্রশ্ন গুরুতর হতে পারে। আসলে, তারা প্রায়শই হয়। :-)
টিজে ক্রোডার 24'11

3
প্রাসঙ্গিক প্রশ্ন এবং উত্তরটি মেমরির সারিবদ্ধকরণ কীভাবে হয় তা কে জানে তার পক্ষে স্পষ্ট নয়। +1
বেনজ

উত্তর:


153

এটার মত:

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

অথবা

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

(পরবর্তী সিনট্যাক্সটি ভেরিয়েবল ডিক্লেয়ারেশনের বিন্দু ব্যতীত অন্য কার্যক্রমে ব্যবহার করা যেতে পারে, তবে সংক্ষিপ্ত বাক্য গঠনটি কেবল ঘোষণার সাথে কাজ করে))


দ্বিতীয় সংশ্লেষটি কী করে আপনি আরও ব্যাখ্যা করতে পারেন? এটা আমার কাছে এক ধরণের অস্পষ্ট।
টেরেন্স পোনস

4
@ টেরেন্স: এটি প্রথমটির মতোই করে: এটি অ্যারে 1, অ্যারে 2, অ্যারে 3, অ্যারে 4 এবং অ্যারে 5 এর মান থেকে শুরু করে স্ট্রিং অ্যারে রেফারেন্সের একটি অ্যারে তৈরি করে - যার প্রত্যেকটিই নিজের মধ্যে স্ট্রিং অ্যারে রেফারেন্স।
জন স্কিটি

1
তাত্ক্ষণিক প্রশ্ন: কত অ্যারে অবজেক্ট তৈরি হবে তা আমার যদি ধারণা না থাকে তবে রান সময়ে আমি কীভাবে এটি করব?
টেরেন্স পোনস

1
@ টেরেন্স: আপনি আরও নির্দিষ্ট উদাহরণ দিতে পারেন? আপনি কম্পাইল-সময়ে প্রাথমিক মান উল্লেখ করছি, তখন আপনি কি আকার জানি। তুমি কি এরকম কিছু বোঝাতে চাও new String[10][]?
জন স্কিটি

হ্যাঁ. পিটার এর উত্তর অনুরূপ।
টেরেন্স পোনস

71

চেষ্টা

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

1
এটি একটি আরও নমনীয়
হিটোব্লগ

আপনার অ্যারেতে একটি নির্দিষ্ট আকার নির্ধারণ করা উচিত নয়?
ফিলিপ

@ ফিলিপ এটি 5 এ স্থির করা হয়েছে পরবর্তী স্তরের সেটগুলি তাদের পূর্ব-বরাদ্দ করে তবে এটি পরিবর্তন করা যেতে পারে তাই এটি সেট করা কার্যকর নাও হতে পারে।
পিটার লরে

8
অ্যারেতে আমি কীভাবে ডেটা ?োকাব? এর গতিশীল ডাটা থাকলে?
প্রখর মোহন শ্রীবাস্তব

1
@ প্রচারমোহনশ্রীবাস্তব আপনি পৃথকভাবে উপাদানগুলি সেট করতে পারেন: arrays[0] = new String[] {"a", "b", "c"}বা একটি অস্থায়ী তালিকা ব্যবহার করুন: <পছন্দ> <কোড> তালিকা <স্ট্রিং []> মাইলিস্ট = নতুন অ্যারেলিস্ট <> (); myList.add (নতুন স্ট্রিং [] a "ক", "বি", "সি";); myList.add (নতুন স্ট্রিং [] {"ডি", "ই", "চ";); myList.toArray (অ্যারে); </code> </pre>
kntx

26

এটি করার জন্য আপনাকে দুটি দুর্দান্ত উত্তর দেওয়ার পরেও আমার কাছে মনে হয় যে আরও একটি উত্তর অনুপস্থিত: বেশিরভাগ ক্ষেত্রে আপনার এটি করা উচিত নয়।

অ্যারেগুলির কষ্টকর বেশিরভাগ ক্ষেত্রেই আপনি ব্যবহার ভালো হয় সংগ্রহ এপিআই

সংগ্রহগুলির সাহায্যে আপনি উপাদানগুলি যুক্ত করতে এবং মুছে ফেলতে পারেন এবং বিভিন্ন কার্যকারিতা (সূচক-ভিত্তিক চেহারা, বাছাই, স্বতন্ত্রতা, ফিফো-অ্যাক্সেস, কনক্রান্সিয়েন্স ইত্যাদি) জন্য বিশেষ সংগ্রহ রয়েছে।

অ্যারে এবং তাদের ব্যবহার সম্পর্কে জেনে রাখা এটি অবশ্যই ভাল এবং গুরুত্বপূর্ণ, বেশিরভাগ ক্ষেত্রে সংগ্রহগুলি ব্যবহার করে এপিআইগুলিকে অনেক বেশি পরিচালনাযোগ্য করে তোলে (এজন্য গুগল পেয়ার মতো নতুন লাইব্রেরি খুব কমই অ্যারে ব্যবহার করে না)।

সুতরাং, আপনার দৃশ্যের জন্য, আমি তালিকাগুলির তালিকাকে পছন্দ করব এবং পেয়ারা ব্যবহার করে এটি তৈরি করব:

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

স্ট্রিং [] [] এর চেয়ে কিছুটা জটিল, তবে কনটেনেটিং ডেটার মতো আরও ক্রিয়াকলাপের অনুমতি দেয়। তবে, আপনার সমাধান ডেটার আকার নিশ্চিত করে না, যা কোনও সমস্যা হতে পারে।
বেনজ

1
@ বেঞ্জ যদি প্রয়োজন হয় তবে একটি তালিকা সাজসজ্জা লিখতে সর্বদা সম্ভব যে কেবল নির্দিষ্ট সংখ্যক আইটেম গ্রহণ করে।
শন প্যাট্রিক ফ্লয়েড

সংক্ষিপ্ততা সুনিশ্চিত করার জন্য সঠিক, সজ্জকার / মোড়ক একটি ভাল উপায়। সুতরাং, আমরা যেভাবে কথা বলছি তা সহজ অ্যারের চেয়ে অনেক বেশি জটিল। আমি যা করেছি তা একটি ছোট্ট ইউটিলিটি ক্লাস অ্যারে 2 ডি <টি> যা কিছু প্রাথমিক পদ্ধতি যেমন এক্সিক্স্ট (...) ইত্যাদির সজ্জিত করে আমি এটি নীচে পোস্ট করেছি।
বেনজ

6

শন প্যাট্রিক ফ্লয়েডের সাথে আমরা যে মন্তব্য করেছি তাতে আমি ক্লাসটি উল্লেখ করেছি: আমি এটি একটি অদ্ভুত ব্যবহার দিয়ে করেছি যা WeakReferences প্রয়োজন, তবে আপনি যে কোনও বস্তু দ্বারা এটি সহজেই পরিবর্তন করতে পারেন।

এটি আশা করা যে কোনও দিন কাউকে সহায়তা করতে পারে :)

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
@ শীন: আমি কোডটি সংশোধন করেছি (আপনার বিজ্ঞ মন্তব্য সহ "নো-জিসি বাফার" দিয়ে একটি নতুন পোস্ট করেছেন
বেঞ্জ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.