निर्दिष्ट सूचकांक पर ArrayList में ऑब्जेक्ट जोड़ें


142

मुझे लगता है कि यह काफी सरल प्रश्न है, लेकिन मैं यह नहीं समझ सकता कि यह कैसे ठीक से किया जाए।

मुझे एक खाली सूची मिली है:

ArrayList<object> list = new ArrayList<object>();

मुझे कुछ ऑब्जेक्ट मिले हैं जिन्हें मैं जोड़ना चाहता हूं और प्रत्येक ऑब्जेक्ट को एक निश्चित स्थान पर होना है। हालांकि यह आवश्यक है कि उन्हें प्रत्येक संभावित क्रम में जोड़ा जा सके। जब मैं यह कोशिश करता हूं, तो यह काम नहीं करता है और मुझे एक मिलता है IndexOutOfBoundsException:

list.add(1, object1)
list.add(3, object3)
list.add(2, object2)

क्या मैं कोशिश की है भरने है ArrayListके साथ nullऔर फिर ऊपर कर। यह काम करता है, लेकिन मुझे लगता है कि यह एक भयानक समाधान है। क्या इसे करने का और कोई तरीका है?


7
आप एक IndexOutOfBoundsException प्राप्त करते हैं क्योंकि सूची खाली है और आप एक सूची स्थिति तक नहीं पहुंच सकते हैं जो मौजूद नहीं है ...
विक

1
क्या अशक्त वस्तुओं के साथ सूची को भरने के बिना उस स्थिति को बनाने का एक तरीका है? मेरे लिए ऐसा लगता है कि यह वास्तव में अजीब समाधान है।
जे। मास

1
मुझे ऐसा नहीं लगता है ... यदि आपको वस्तुओं को यादृच्छिक क्रम में जोड़ने की आवश्यकता है, तो आपको इसे करने का एक और तरीका तलाशना होगा। उदाहरण के लिए एक विशिष्ट सरणी के साथ: 'ऑब्जेक्ट []' और फिर आपको करना चाहिए। 'इसे भरना है, बस इनिशियलाइज़ करें
विक

1
@Maethortje यह वास्तव में एक अजीब समस्या नहीं है। विरल सूचियों को देखें, reference.wolfram.com/mathematica/tutorial/… एक अच्छा लेख लगता है। जावा में, कुंजी के रूप में इंडेक्स वाला मैप सबसे आसान तरीका हो सकता है।
दयनीय चर

2
@ यदि आप आकार घोषित करते हैं तो भी .. यह केवल सूची को आरंभीकृत नहीं करता है, बल्कि यह घोषित करता है कि आप मेमोरी में कितनी जगह आरक्षित करना चाहते हैं .. जैसा कि मैं इसे देखता हूं, एक सूची तत्वों की एक सरणी है जिसका एक सूचक भी है अगला तत्व। यदि आप दूसरे खाली (या शून्य) होने पर किसी तत्व को तीसरी स्थिति में जोड़ने का प्रयास करते हैं, तो आपको यह पता लगाने में मदद करने के लिए कोई संकेतक नहीं है कि यह तीसरा तत्व है ..: 1-> 2-> 3 ठीक है, लेकिन 1- > * -> 3 यहाँ आपको एक समस्या है ...
विक

जवाबों:


209

आप इसे इस तरह से कर सकते हैं:

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

ऑब्जेक्ट 2 को स्थिति 2 में जोड़ने के बाद, यह ऑब्जेक्ट 3 को स्थिति 3 में ले जाएगा।

यदि आप चाहते हैं कि ऑब्जेक्ट 3 स्थिति 3 पर हो तो मैं आपको सुझाव दूंगा कि आप एक हैशमैप का उपयोग मूल्य के रूप में कुंजी और ऑब्जेक्ट के रूप में करें।


3
एक हैशमैप वास्तव में इस समस्या को हल करने में सक्षम होगा। मुझे लगता है कि मैं उस एक के लिए जाऊंगा क्योंकि ऐसा नहीं लगता है कि मैं स्थान 3 पर कुछ जोड़ सकता हूं जब स्थान पर कोई वस्तु न हो 2.
जे। Maes

कम लेकिन सबसे ज्यादा जवाब। अन्य लोग बस गलत रास्ते पर हैं
शब्बीर धनंगोट

एक रचनात्मक तर्क!
अर्सल इमाम

31

आप वस्तुओं के सरणी का उपयोग कर सकते हैं और इसे ArrayList में बदल सकते हैं-

Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";

List<Object> list= Arrays.asList(array);

ArrayList होगा- [1, null, 2, 3, null, null, null, 7, null, null]


2
एक दोष यह है कि आपको पहले से आकार जानना होगा।
डैनियल हारी

17

यदि ऐसा है तो आप एक नियमित एरे का उपयोग करने पर विचार क्यों नहीं करते हैं, क्षमता को इनिशियलाइज़ करें और अपने इच्छित इंडेक्स पर ऑब्जेक्ट डालें।

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;

आप क्षमता का अनुमान लगाते हैं, लेकिन 'एरियरिस्ट' के आकार का नहीं। आकार को तत्वों की संख्या के रूप में परिभाषित किया गया है, और जब सूचकांक> आकार अपवाद होता है ...
विक

@, मैं पहले प्रश्न को गलत मानता हूं, लेकिन टिप के लिए धन्यवाद।
मेडपाल

मैंने 10 की क्षमता को इनिशियलाइज़ किया है, लेकिन एक ऑब्जेक्ट जोड़ते समय मुझे अभी भी एक IndexOutOfBoundsExceptopn मिलता है। यह सुनिश्चित करने की क्षमता बदलने की क्षमता के साथ ही। केवल एक चीज जो काम करती है वह इस समय शून्य से भर रही है ...
जे। सेस

@Maortortje "आकार" और "क्षमता" के बीच अंतर की तलाश करें ... अपवाद तब आता है जब सूचकांक> आकार है, तब नहीं जब यह> क्षमता .....
विक

जैसा कि लोगों ने उल्लेख किया है, आप सूचकांक 3 में एक वस्तु जोड़ रहे हैं, जबकि सूची का आकार अभी भी 1 है। यह संभव नहीं है। विशिष्ट इंडेक्स में जोड़ने की अनुमति तब तक दी जाती है जब तक यह इंडेक्स सूची की सीमाओं के अंदर है, उदाहरण के लिए यदि आपकी सूची में 3 ऑब्जेक्ट हैं, तो आप इंडेक्स 100 पर ऑब्जेक्ट नहीं जोड़ सकते हैं।
medopal

14

आप ArrayList को अपने आकार और उस तत्व के बीच नल डालने के लिए भी ओवरराइड कर सकते हैं जिसे आप जोड़ना चाहते हैं।

import java.util.ArrayList;


public class ArrayListAnySize<E> extends ArrayList<E>{
    @Override
    public void add(int index, E element){
        if(index >= 0 && index <= size()){
            super.add(index, element);
            return;
        }
        int insertNulls = index - size();
        for(int i = 0; i < insertNulls; i++){
            super.add(null);
        }
        super.add(element);
    }
}

फिर आप ArrayList में किसी भी बिंदु पर जोड़ सकते हैं। उदाहरण के लिए, यह मुख्य विधि:

public static void main(String[] args){
    ArrayListAnySize<String> a = new ArrayListAnySize<>();
    a.add("zero");
    a.add("one");
    a.add("two");
    a.add(5,"five");
    for(int i = 0; i < a.size(); i++){
        System.out.println(i+": "+a.get(i));
    }
}   

इस परिणाम को कंसोल से प्राप्त करें:

0: शून्य

1 एक

2: दो

3: अशक्त

4: अशक्त

5: पांच


9

मैं ArrayList.addप्रलेखन पर आपका ध्यान आकर्षित करता हूं , जो कहता है कि यह फेंकता है IndexOutOfBoundsException- यदि सूचकांक सीमा से बाहर है ( index < 0 || index > size())

size()कॉल करने से पहले अपनी सूची की जाँच करेंlist.add(1, object1)


आप सही हैं @ हेमल, @ मैथोर्टजे आप सूची में तत्व को जोड़ने से पहले सूची के आकार की जांच क्यों नहीं करते? जांचें कि क्या आप जिस स्थिति को जोड़ने की कोशिश कर रहे हैं, वह सूची के आकार से कम है, यदि नहीं, तो आप बस एक सामान्य कर सकते हैंlist.add("element");
राकेश

1
जैसा कि मैंने इसे समझा, "समस्या" तत्व 3 को स्थिति में जोड़ना है, भले ही स्थिति 2 में कोई तत्व न हो ...
विक

@Vis एक विरल सूची है - प्रश्न के लिए मेरी टिप्पणी देखें।
दयनीय चर

5

आपको रिक्त इंडेक्स को नल के साथ पॉप्युलेट करने की आवश्यकता है।

while (arraylist.size() < position)
{
     arraylist.add(null);
}

arraylist.add(position, object);

2
@Maethortje 

The problem here is java creates an empty list when you called new ArrayList and 

निर्दिष्ट स्थान पर एक तत्व जोड़ने का प्रयास करते समय आपको IndexOutOfBound मिला, इसलिए सूची में उनकी स्थिति में कुछ तत्व होने चाहिए।

कृपया निम्नलिखित प्रयास करें

/*
  Add an element to specified index of Java ArrayList Example
  This Java Example shows how to add an element at specified index of java
  ArrayList object using add method.
*/

import java.util.ArrayList;

public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to Arraylist
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    /*
      To add an element at the specified index of ArrayList use
      void add(int index, Object obj) method.
      This method inserts the specified element at the specified index in the
      ArrayList.  
    */
    arrayList.add(1,"INSERTED ELEMENT");

    /*
      Please note that add method DOES NOT overwrites the element previously
      at the specified index in the list. It shifts the elements to right side
      and increasing the list size by 1.
    */

    System.out.println("ArrayList contains...");
    //display elements of ArrayList
    for(int index=0; index < arrayList.size(); index++)
      System.out.println(arrayList.get(index));

  }
}

/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3

*/

मैं उस समस्या को समझता हूं जो मेरी गलती का कारण है। ऐसा लगता है कि मुझे उस स्थिति में ऑब्जेक्ट जोड़ने से पहले मुझे बाद की स्थितियों में ऑब्जेक्ट जोड़ना होगा। जिस क्षण मैं जोड़ रहा हूं, मैं उन सभी वस्तुओं का निपटान नहीं कर रहा हूं जिन्हें मैं जोड़ना चाहता हूं। क्या आपको लगता है कि अशक्त वस्तुओं को जोड़ना एक उचित समाधान है?
जे। मास

@ मैथॉर्त्ज यह ऐसा करने के लिए बहुत उचित नहीं होगा, जैसा कि इसके सिर्फ एक हैक :)
संकल्प

आपको पहले पैराग्राफ से कोड नमूना उद्धरण निकालने की आवश्यकता है।
जलाल सोर्डो

2

whileसमाधान के रूप में इस छोटे लूप के बारे में कैसे ?

private ArrayList<Object> list = new ArrayList<Object>();

private void addObject(int i, Object object) {
    while(list.size() < i) {
        list.add(list.size(), null);
    }
    list.add(i, object);
}
....

addObject(1, object1)
addObject(3, object3)
addObject(2, object2)

2

यह एक संभव उपाय है:

list.add(list.size(), new Object());

1

मुझे लगता है कि आप जो चाहते हैं, उसका समाधान मेदोपाल से है।

लेकिन बस एक और वैकल्पिक उपाय है कि आप HashMap का उपयोग करें और पदों को संग्रहीत करने के लिए कुंजी (पूर्णांक) का उपयोग करें।

इस तरह से आपको इसे शुरू में नल आदि के साथ आबाद करने की आवश्यकता नहीं होगी, बस मानचित्र और स्थिति को ऑब्जेक्ट में चिपकाएँ जैसे आप साथ चलते हैं। यदि आप इसे इस तरह की आवश्यकता है, तो आप इसे सूची में बदलने के लिए अंत में कुछ पंक्तियाँ लिख सकते हैं।


नहीं है TreeMap कुंजी के आदेश के बाद से बेहतर है?
डैनियल हारी

1

मान लें कि आप किसी आइटम को किसी स्थिति में जोड़ना चाहते हैं, तो सूची का आकार स्थिति से अधिक होना चाहिए।

add(2, item): इस वाक्यविन्यास का अर्थ है, पुरानी वस्तु को स्थिति 2 से अगले सूचकांक पर ले जाएँ और आइटम को दूसरी स्थिति में जोड़ें।

यदि दूसरी स्थिति में कोई आइटम नहीं है, तो यह काम नहीं करेगा, यह एक अपवाद फेंक देगा।

इसका मतलब है कि अगर आप कुछ में जोड़ना चाहते हैंposition 2,

आपकी सूची का आकार कम से कम होना चाहिए (2 + 1) =3,ताकि आइटम उपलब्ध हों0,1,2 Position.

इस तरह से यह सुनिश्चित होता है कि स्थिति 2 सुरक्षित रूप से एक्सेस की जाती है और कोई अपवाद नहीं होगा।


2
जब मैं आपका उत्तर अधिसूचित कर रहा हूँ, तो मैं बस से गुजर रहा हूँ ... वास्तव में, सूचकांक उस समय की वास्तविक लंबाई से कम या बराबर होना चाहिए , जिस समय हम नया आइटम सम्मिलित कर रहे हैं। exhample: सूची का आकार 2 है: इंडेक्स 2 में जोड़ना काम करेगा। अनुक्रमणिका 3 में जोड़ना एक अपवाद फेंक देगा। (यह परीक्षण किया गया था)
हॉउससेम चेलीगू

0

यदि आप जावा के Android स्वाद का उपयोग कर रहे हैं, तो क्या मैं SparseArray का उपयोग करने का सुझाव दे सकता हूं । यह ऑब्जेक्ट्स के लिए पूर्णांकों की अधिक मेमोरी कुशल मैपिंग है और मैप की तुलना में इसे पुनरावृत्त करना आसान है


0

थोड़ा देर से लेकिन उम्मीद है कि अभी भी किसी के लिए उपयोगी हो सकता है।

किसी विशिष्ट स्थिति में आइटम जोड़ने के 2 चरण ArrayList

  1. add null आइटम्स को एक विशिष्ट इंडेक्स में a ArrayList
  2. फिर setआवश्यकता पड़ने पर स्थिति।

        list = new ArrayList();//Initialise the ArrayList
    for (Integer i = 0; i < mItems.size(); i++) {
        list.add(i, null); //"Add" all positions to null
    }
       // "Set" Items
        list.set(position, SomeObject);

इस तरह आपके पास निरर्थक आइटम नहीं हैं ArrayListअर्थात यदि आप आइटम जोड़ना चाहते हैं जैसे,

list = new ArrayList(mItems.size());    
list.add(position, SomeObject);

यह होगा नहीं अधिलेखित स्थिति में आइटम मौजूदा केवल एक-एक करके सही करने के लिए मौजूदा स्थानांतरण - तो आप कई indicies रूप में दो बार के साथ एक ArrayList है।


0

सूचकांक में मौजूदा मूल्य को बदलने के लिए आपको ऐड के बजाय सेट करना चाहिए।

list.add(1, object1)
list.add(2, object3)
list.set(2, object2)

सूची में शामिल होंगे [object1, object2]

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