मैं गतिशील रूप से जावा सरणी में आइटम कैसे जोड़ सकता हूं?


85

PHP में, आप गतिशील रूप से निम्न द्वारा सरणियों में तत्व जोड़ सकते हैं:

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

इसके बाद, इस $xतरह एक सरणी होगी {1,2}:।

क्या जावा में कुछ ऐसा ही करने का एक तरीका है?


4
नीचे दिए गए सभी उत्तरों में ArrayList का उपयोग किया गया है लेकिन OP विशेष रूप से Array के लिए पूछते हैं। मेरी भी जानने की इच्छा होगी।
KJYe.Name

4
उत्तर 'नहीं' है। आपको जावा में घोषणा / निर्माण के समय सरणी का आकार (या सभी तत्वों को आबाद करना) निर्दिष्ट करना होगा। कृपया java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh

मैंने देखा कि विभिन्न जावा फ़ंक्शन रिटर्न एरेज़, इसलिए फ़ाइल.जावा में सूची (फ़िल्टर) के कार्यान्वयन को देखा। यह आंतरिक रूप से एक सूची का उपयोग करता है और फिर इसे अंत में एक सरणी में परिवर्तित करता है। सूची <string> v = new ArrayList <> (); ... वापसी v.toArray (नया स्ट्रिंग [v.size ()]);
xtempore 19

जवाबों:


112

Java.util को देखें।लिंकडलिस्ट या java.util.ArrayList

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

21
यह एक टुकड़ा को छोड़कर एक सही उत्तर है। आम तौर पर जावा में हम सिर्फ आदिम सरणियों के बजाय सूची की उपयोग करते हैं, लेकिन ऐसे उदाहरणों के लिए जहां आपको वास्तव में एक आदिम सरणी की आवश्यकता होती है (जैसे int[]) बस toArray()सूची पर विधि का उपयोग करें । उपरोक्त कोड का उपयोग करें लेकिन x.toArray()एक आदिम सरणी प्राप्त करने के लिए उपयोग करें।
rharter

1
99% मामलों में (99.99999% से अधिक मामलों की तरह) यदि आपको वास्तव में एक आदिम सरणी की आवश्यकता है, तो आप कुछ गलत कर रहे हैं, और इसे ओओ सिद्धांतों से संभाला जाना चाहिए। जब तक आप देशी कोड, या ओरेकल ARRAYऑब्जेक्ट्स या इस तरह की कुछ खटास के साथ हस्तक्षेप नहीं कर रहे हैं, आप आदिम सरणियों से बचने के लिए बहुत बेहतर हैं।
corsiKa

11
ओह, इन सभी टिप्पणियों के बारे में कि कैसे आपको आदिम सरणियों का उपयोग नहीं करना चाहिए, यदि केवल यह इतना आसान था :(
thecoshman

1
@trusktr ऐसा करने का एक कारण है। इस उदाहरण में, यह ... की तर्ज पर अधिक है ... एक Listसंदर्भ का उपयोग करके ArrayListहम किसी भी समय हम चाहते हैं पर अंकुश लगा सकते हैं। यदि कोई बेहतर सूची जारी करता है, जैसे SuperDuperAwesomeList, हमारे पास बहुत सारे काम हो सकते हैं यदि हमने अपना संदर्भ बनाया है ArrayList। ArrayList में ऐसी चीजें हैं जो सूची में नहीं है। यदि हम अपने कोड में उन चीजों पर भरोसा करते हैं, तो उन्हें स्वैप करना बहुत मुश्किल हो जाता है।
corsiKa

1
@corsiKa, आदिम के बिना कुछ संपीड़न / एन्कोडिंग एल्गोरिदम लिखें और उन मामलों में 99 की तुलना में बहुत अधिक सामान्य हैं। (9)। Маtrix के रूप में अच्छी तरह से चीख प्राइमिटिव चिल्लाती है। एक फ्लिप नोट पर यदि आप देशी कोड के साथ इंटरैक्ट करते हैं तो आप डायरेक्टबर्फर्स का उपयोग करते हैं न कि आदिम सरणियों का। अंत में किसी के पास धातु है, यदि आप डेटाबेस और प्रस्तुति के साथ फंस गए हैं, तो यह ठीक है लेकिन 99% का बयान सिर्फ मूर्खतापूर्ण है।
'10:55 पर bestsss

64

जावा में एरर्स का एक निश्चित आकार है, इसलिए आप पीएचपी में जैसा कर सकते हैं वैसा कुछ "अंत में नहीं जोड़ सकते हैं"।

PHP व्यवहार के समान एक सा है:

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));

लेकिन यह योजना बड़ी सरणियों के लिए बहुत ही अयोग्य है , क्योंकि यह हर बार पूरे सरणी की एक प्रति बनाती है। (और यह वास्तव में पूरी तरह से PHP के समतुल्य नहीं है, क्योंकि आपकी पुरानी सरणियाँ वही रहती हैं)।

PHP सरणियाँ वास्तव में एक अतिरिक्त "अधिकतम कुंजी" के साथ एक जावा हैशपॅप के समान हैं, इसलिए यह पता चलेगा कि आगे किस कुंजी का उपयोग करना है, और एक अजीब पुनरावृत्ति क्रम (और पूर्णांक संबंध और कुछ स्ट्रिंग्स के बीच एक अजीब समानता का संबंध)। लेकिन सरल अनुक्रमित संग्रह के लिए, अन्य उत्तरदाताओं की तरह जावा में एक सूची का बेहतर उपयोग करें।

यदि आप Listइंटेगर में हर इंट को लपेटने के ओवरहेड के कारण उपयोग करने से बचना चाहते हैं , तो आदिम प्रकारों के लिए संग्रह के पुन: कार्यान्वयन का उपयोग करने पर विचार करें, जो आंतरिक रूप से सरणियों का उपयोग करते हैं, लेकिन हर बदलाव पर एक प्रति नहीं करेंगे, केवल आंतरिक सरणी पूर्ण होने पर ArrayList की तरह)। (एक जल्दी से जाना जाता उदाहरण इस IntList वर्ग है ।)

अमरूद में शामिल है इस तरह के रैपर बनाने के तरीकों में Ints.asList, Longs.asListआदि


यह स्वीकृत समाधान की तुलना में अधिक स्मार्ट है। कोई व्यर्थ वस्तु नहीं।
धुंध

2
@ मिहेल: दरअसल, मैं आमतौर पर ऐसा करने की सलाह नहीं देता हूं, क्योंकि किसी तत्व के प्रत्येक ऐड के लिए एक नया एरे बनाया जाता है और पूरी सामग्री कॉपी की जाती है। (यह आपके उपयोग के मामले पर निर्भर करता है, हालांकि - यदि आप कुछ भी जोड़ते / हटाते हैं, और अक्सर पुनरावृत्ति / खोज करते हैं, तो यह ठीक हो सकता है।)
पाओलो एर्बमैन

नए संस्करणों में ArrayUtils में वह तरीका है जो वह करता है। मैं कार्यान्वयन की जांच करने के लिए बहुत आलसी हूं, लेकिन मुझे पूरा यकीन है कि उन्होंने इसे अच्छी तरह से लिखा है।
धुंध

1
@MihailStoynov वास्तव में, यह अनिवार्य रूप से क्या ArrayListकरता है - सिवाय इसके कि हर ऐड पर रिसाइज करने के बजाय, जब यह कमरे से बाहर निकलता है तो यह आकार में दोगुना हो जाता है, इसलिए इसे अक्सर जैसा नहीं होना चाहिए।
corsiKa

1
@Mav नहीं, क्योंकि orgएक से कम है result
पाओलो एबरमन

19

अपाचे कॉमन्स में नए सरणी के अंत में एक तत्व जोड़ने के लिए एक ArrayUtils कार्यान्वयन है:

/** 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)

2
नए ArrayUtils में यह बताया गया है: ArrayUtils.appendElement (String.class, origArray, "नए तत्व")
marmor

12

मैंने इस प्रश्न को वेब और मेरी राय में बहुत बार देखा है, उच्च प्रतिष्ठा वाले कई लोगों ने इन सवालों का ठीक से जवाब नहीं दिया। इसलिए मैं यहां अपना जवाब व्यक्त करना चाहूंगा।

पहले हमें विचार करना चाहिए कि और के बीच अंतर हैarrayarraylist

एक तत्व को एक सरणी में जोड़ने के लिए प्रश्न पूछता है , और न कि ArrayList


जवाब बहुत सरल है। इसे 3 चरणों में किया जा सकता है।

  1. सरणी को एक सरणी सूची में बदलें
  2. तत्व को arrayList में जोड़ें
  3. नई arrayList को array में कन्वर्ट करें

यहाँ इसका साधारण चित्र दिया गया है यहां छवि विवरण दर्ज करें

और अंत में यहाँ कोड है:

चरण 1:

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

चरण 2:

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);
}

1
Upvoted क्योंकि अंत में किसी को एक वास्तविक सरणी और ArrayList के बीच अंतर बाहर बुलाया ...
JoeG

सबसे पूर्ण और वर्णनात्मक उत्तर।
ओबैद

11

आप एक का उपयोग कर सकते हैं ArrayListऔर फिर toArray()विधि का उपयोग कर सकते हैं । लेकिन आप जो कर रहे हैं, उसके आधार पर, आपको एक सरणी की भी आवश्यकता नहीं हो सकती है। देखने में देखो Listsकि क्या आप चाहते हैं और अधिक कर रहे हैं।

देखें: जावा सूची ट्यूटोरियल



4

आप गतिशील रूप से JAVA में संग्रह चौखटे का उपयोग करके एक सरणी में तत्वों को जोड़ सकते हैं। संग्रह फ्रेमवर्क आदिम डेटा प्रकारों पर काम नहीं करता है।

यह कलेक्शन फ्रेमवर्क "java.util। *" पैकेज में उपलब्ध होगा

उदाहरण के लिए यदि आप ArrayList का उपयोग करते हैं,

उस पर एक ऑब्जेक्ट बनाएं और फिर तत्वों की संख्या जोड़ें (किसी भी प्रकार जैसे स्ट्रिंग, इंटेगर ... आदि)

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()));
        }
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.