আমি কীভাবে একটি জাভা অ্যারে আইটেমগুলি গতিশীলভাবে যুক্ত করতে পারি?


86

পিএইচপি-তে, আপনি নিম্নলিখিত দ্বারা অ্যারেগুলিতে গতিশীলভাবে উপাদান যুক্ত করতে পারেন:

$x = new Array();
$x[] = 1;
$x[] = 2;

এর পর $xভালো একটি অ্যারে হবে: {1,2}

জাভাতেও অনুরূপ কিছু করার কোনও উপায় আছে?


4
নীচের সমস্ত উত্তরের জন্য অ্যারেলিস্ট ব্যবহার করে তবে ওপি বিশেষত অ্যারের জন্য জিজ্ঞাসা করে। আমি পাশাপাশি জানতে চাই।
কেজেওয়াই.নেম

4
উত্তরটি 'না'। জাভাতে ঘোষণার / সৃষ্টির সময় আপনাকে অ্যারের আকারটি নির্দিষ্ট করতে হবে (বা সমস্ত উপাদানকে বসিয়ে দেবে)। দয়া করে java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html দেখুন
রিতেশ

আমি লক্ষ্য করেছি যে বিভিন্ন জাভা ফাংশন রিটার্ন করে, তাই ফাইল.জভাতে তালিকা (ফিল্টার) প্রয়োগের দিকে তাকিয়ে। এটি অভ্যন্তরীণভাবে একটি তালিকা ব্যবহার করে এবং তারপরে এটিকে শেষে অ্যারেতে রূপান্তর করে। <স্ট্রিং> ভি = নতুন অ্যারেলিস্ট <> () তালিকা; ... রিটার্ন v.toArray (নতুন স্ট্রিং [v.size ()]);
xtempore

উত্তর:


112

Java.util.LinkkedList বা java.util.ArrayList দেখুন

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);

21
এটি এক টুকরা বাদে একটি সঠিক উত্তর। সাধারণত জাভাতে আমরা আদিম অ্যারেগুলির পরিবর্তে কেবলমাত্র তালিকা ব্যবহার করি তবে উদাহরণগুলির জন্য যেখানে আপনার আসলে একটি আদিম অ্যারের প্রয়োজন (যেমন int[]) কেবলমাত্র তালিকার toArray()পদ্ধতিটি ব্যবহার করুন । উপরের কোডটি ব্যবহার করুন তবে x.toArray()একটি আদিম অ্যারে পেতে ব্যবহার করুন ।
rharter

4
99% ক্ষেত্রে (99.99999% এর মতো ক্ষেত্রে) যদি আপনার প্রকৃতপক্ষে আদিম অ্যারে প্রয়োজন হয় তবে আপনি কিছু ভুল করছেন, এবং এটি ওও নীতির সাথে পরিচালনা করা উচিত। আপনি যদি স্থানীয় কোড, বা ওরাকল ARRAYঅবজেক্টের মতো কিছু বা এর মতো কিছু বোকামির সাথে হস্তক্ষেপ না করেন তবে আপনি আদিম অ্যারেগুলি এড়িয়ে চলা ভাল better
কর্সিকা

11
ওহ, আপনার কীভাবে আদিম অ্যারে ব্যবহার করা উচিত নয় সে সম্পর্কে এই সমস্ত মন্তব্য: কেবল এটিই যদি সহজ ছিল :(
thecoshman

4
@trusktr এটি করার এক কারণ। এই উদাহরণস্বরূপ, এটি আরও অনেক ধরণের লাইনের সাথে রয়েছে ... একটি Listরেফারেন্স ব্যবহার করা আমাদের ArrayListযেকোন সময় চাইলে কার্বকে লাথি মারতে দেয় । যদি কেউ আরও ভাল তালিকা প্রকাশ করে, যেমন SuperDuperAwesomeList, আমরা আমাদের রেফারেন্সটি একটি করে রাখি তবে আমাদের অনেক কাজ করতে পারে ArrayList। অ্যারেলিস্টে এমন জিনিস রয়েছে যা তালিকায় নেই। আমরা যদি আমাদের কোডগুলিতে এই জিনিসগুলির উপর নির্ভর করি তবে এটিকে পরিবর্তন করা আরও অনেক কঠিন হয়ে পড়ে।
কর্সিকা

4
@ কর্সিকা, আদিমগুলি ছাড়াই কিছু সংক্ষেপণ / এনকোডিং অ্যালগরিদম লিখুন এবং এই ক্ষেত্রেগুলি 99 এর চেয়ে অনেক বেশি সাধারণ ((9)। অ্যাট্রিক্স চিৎকার প্রিমিটিভগুলিও প্ররোচিত করে। একটি ফ্লিপ নোটে যদি আপনি নেটিভ কোডের সাথে ইন্টারঅ্যাক্ট করেন তবে আপনি ডাইরেক্টবাফারগুলি আদিম অ্যারে ব্যবহার করেন না। শেষ পর্যন্ত কারও কাছে ধাতব জিনিস থাকতে হবে, যদি আপনি ডাটাবেস এবং উপস্থাপনায় আটকে থাকেন তবে ঠিক আছে তবে 99% এর বক্তব্যটি কেবল নির্বোধ।
বেটসেস

65

জাভাতে অ্যারেগুলির একটি নির্দিষ্ট আকার থাকে, তাই আপনি পিএইচপি-তে যেমন করতে পারেন তেমন "শেষে কিছু যোগ করতে" পারবেন না।

পিএইচপি আচরণের সাথে কিছুটা মিল এটি:

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

তারপরে আপনি লিখতে পারেন:

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

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

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

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

পেয়ারা রয়েছে যেমন চাদরে তৈরি পদ্ধতি মধ্যে Ints.asList, Longs.asListইত্যাদি


এটি গৃহীত সমাধানের চেয়ে অনেক বেশি স্মার্ট। কোন নষ্ট বস্তু।
কুয়াশা

4
@ মিহাইল: আসলে, আমি সাধারণত এটি করার পরামর্শ দিই না, কারণ প্রতিটি উপাদান যুক্ত করার জন্য একটি নতুন অ্যারে তৈরি করা হয় এবং পুরো বিষয়বস্তু অনুলিপি করা হয়। (এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে, যদিও - আপনি যদি খুব কমই কিছু যোগ / মুছে ফেলেন এবং প্রায়শই পুনরাবৃত্তি / অনুসন্ধান করেন তবে তা ঠিক হতে পারে))
পাওলো ইবারম্যান 24:51

নতুন সংস্করণগুলিতে অ্যারে ইউটিলে এমন পদ্ধতি রয়েছে যা তা করে। আমি বাস্তবায়নটি পরীক্ষা করতে বেশ অলস, তবে আমি নিশ্চিত যে তারা এটি ভাল লিখেছেন।
কুয়াশা

4
@ মিহাইলস্টোইনভ আসলে, এটি মূলত যা ArrayListঘটে - প্রতিটি অ্যাডের পরিবর্তনের পরিবর্তে, যখন এটি ঘর থেকে বাইরে চলে যায় তখন আকারে দ্বিগুণ হয়ে যায় ফলে প্রায়শই পুনরায় আকার পরিবর্তন করতে হবে না।
corsiKa

4
@ মাভ নো, কারণ orgতার চেয়ে কম খাটো result
পাওলো ইবারম্যান

19

নতুন অ্যারের শেষে একটি উপাদান যুক্ত করতে অ্যাপাচি কমন্সে একটি অ্যারে ইউটিলস বাস্তবায়ন রয়েছে:

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)

4
নতুন অ্যারে ইউটিলে এটির মধ্যে রয়েছে: অ্যারে ইউটিলস.এপেন্ডেন্ডেলমেন্ট (স্ট্রিংক্লাস, অরিজিনআরে, "নতুন উপাদান")
মারমোর

12

এই প্রশ্নটি আমি ওয়েবে খুব প্রায়ই দেখেছি এবং আমার মতে, উচ্চ খ্যাতি সম্পন্ন অনেক লোক এই প্রশ্নের উত্তর সঠিকভাবে দেননি। তাই আমি এখানে নিজের উত্তরটি প্রকাশ করতে চাই।

আমরা প্রথমে বিবেচনা করা উচিত সেখানে হয় পার্থক্য মধ্যে arrayএবং arraylist

প্রশ্নটি অ্যারেতে একটি উপাদান যুক্ত করার জন্য জিজ্ঞাসা করে , এবং অ্যারেলিস্টে নয়


উত্তরটা বেশ সাধারন. এটি 3 ধাপে করা যেতে পারে।

  1. অ্যারেকে একটি অ্যারেলিস্টে রূপান্তর করুন
  2. অ্যারেলিস্টে উপাদান যুক্ত করুন
  3. নতুন অ্যারেলিস্টটি অ্যারেতে রূপান্তর করুন

এটির সরল চিত্র এখানে এখানে চিত্র বর্ণনা লিখুন

এবং অবশেষে এখানে কোড:

ধাপ 1:

public List<String> convertArrayToList(String[] array){
        List<String> stringList = new ArrayList<String>(Arrays.asList(array));
        return stringList;
    }

ধাপ ২:

public  List<String> addToList(String element,List<String> list){

            list.add(element);
            return list;
    }

ধাপ 3:

public String[] convertListToArray(List<String> list){
           String[] ins = (String[])list.toArray(new String[list.size()]);
           return ins;
    } 

পদক্ষেপ 4

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}

4
উত্সাহিত হয়েছে কারণ অবশেষে কেউ একজন সত্যিকারের অ্যারে এবং
অ্যারেলিস্টের

সর্বাধিক সম্পূর্ণ এবং বর্ণনামূলক উত্তর।
ওবায়দ

11

আপনি একটি ব্যবহার করতে পারেন ArrayListএবং তারপরে toArray()পদ্ধতিটি ব্যবহার করতে পারেন । তবে আপনি যা করছেন তার উপর নির্ভর করে আপনার এমনকি কোনও অ্যারেও লাগবে না। Listsআপনি চান আরও কি না তা দেখার জন্য দেখুন।

দেখুন: জাভা তালিকা টিউটোরিয়াল



4

আপনি জেভিএ-তে কালেকশন ফ্রেমওয়ার্কগুলি ব্যবহার করে একটি অ্যারেতে গতিশীলভাবে উপাদানগুলি যুক্ত করতে পারেন। সংগ্রহ ফ্রেমওয়ার্ক আদিম ডেটা ধরণের উপর কাজ করে না।

এই সংগ্রহ কাঠামোটি "java.util। *" প্যাকেজে পাওয়া যাবে

উদাহরণস্বরূপ যদি আপনি অ্যারেলিস্ট ব্যবহার করেন,

এটিতে একটি অবজেক্ট তৈরি করুন এবং তারপরে কয়েকটি সংখ্যক উপাদান যুক্ত করুন (স্ট্রিং, পূর্ণসংখ্যার মতো কোনও ধরণের ... ইত্যাদি)

ArrayList a = new ArrayList();
a.add("suman");
a.add(new Integer(3));
a.add("gurram");

এখন আপনাকে একটি অ্যারেতে 3 টি উপাদান যুক্ত করা হয়েছিল।

আপনি যদি যোগ করা উপাদানগুলির কোনও অপসারণ করতে চান

a.remove("suman");

আবার যদি আপনি কোন উপাদান যুক্ত করতে চান

a.add("Gurram");

সুতরাং অ্যারের আকারটি ক্রমশ কমছে / গতিশীলভাবে হ্রাস পাচ্ছে ..



0

আপনি কোথায় আদিম অ্যারে রয়েছেন তার একটি গণনা রাখুন

class recordStuff extends Thread
{
    double[] aListOfDoubles;
    int i = 0;

    void run()
    {
        double newData;
        newData = getNewData(); // gets data from somewhere

        aListofDoubles[i] = newData; // adds it to the primitive array of doubles
        i++ // increments the counter for the next pass

        System.out.println("mode: " + doStuff());
    }

    void doStuff()
    {
        // Calculate the mode of the double[] array

        for (int i = 0; i < aListOfDoubles.length; i++) 
        {
            int count = 0;
            for (int j = 0; j < aListOfDoubles.length; j++)
            {
                if (a[j] == a[i]) count++;
            }
            if (count > maxCount) 
            {
                maxCount = count;
                maxValue = aListOfDoubles[i];
            }
        }
        return maxValue;
    }
}

একটি জাভা আদিম অ্যারেগুলিতে গতিশীলভাবে নতুন আইটেম যুক্ত করা সম্ভব কিনা না মূল প্রশ্নটির সাথে এর আসলেই কোনও সম্পর্ক নেই।
জো দিবস

0

জাভাতে কোনও অ্যারে যুক্ত করার এটি একটি সহজ উপায়। আমি আমার আসল অ্যারে সঞ্চয় করতে একটি দ্বিতীয় অ্যারে ব্যবহার করেছি এবং তারপরে এটিতে আরও একটি উপাদান যুক্ত করেছি। এর পরে আমি সেই অ্যারেটিকে মূল আসলটিতে দিয়েছি।

    int [] test = {12,22,33};
    int [] test2= new int[test.length+1];
    int m=5;int mz=0;
    for ( int test3: test)        
    {          
    test2[mz]=test3; mz++;        
    } 
    test2[mz++]=m;
    test=test2;

    for ( int test3: test)

    {
      System.out.println(test3);
    }

0

জাভাতে অ্যারের আকার নির্ধারিত হয় তবে আপনি এর সূচকটি এবং লুপের জন্য একটি নির্দিষ্ট আকারের অ্যারেগুলিকে গতিশীলভাবে উপাদান যুক্ত করতে পারেন। নীচে উদাহরণ খুঁজে করুন।

package simplejava;

import java.util.Arrays;

/**
 *
 * @author sashant
 */
public class SimpleJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        try{
            String[] transactions;
            transactions = new String[10];

            for(int i = 0; i < transactions.length; i++){
                transactions[i] = "transaction - "+Integer.toString(i);            
            }

            System.out.println(Arrays.toString(transactions));

        }catch(Exception exc){
            System.out.println(exc.getMessage());
            System.out.println(Arrays.toString(exc.getStackTrace()));
        }
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.