নির্দিষ্ট সূচকে অ্যারেলিস্টে অবজেক্ট যুক্ত করুন


142

আমি মনে করি এটি মোটামুটি সহজ প্রশ্ন, তবে কীভাবে এটি সঠিকভাবে করা যায় তা আমি বুঝতে পারি না।

আমি একটি খালি অ্যারেলিস্ট পেয়েছি:

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

আমি যুক্ত করতে চাই এমন কিছু বস্তু পেয়েছি এবং প্রতিটি বস্তু একটি নির্দিষ্ট অবস্থানে থাকতে হবে। এটি প্রতিটি সম্ভাব্য ক্রমে যুক্ত করা যেতে পারে তবে এটি প্রয়োজনীয়। আমি যখন এটি চেষ্টা করি তখন এটি কাজ করে না এবং আমি একটি পাই IndexOutOfBoundsException:

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

কি আমি চেষ্টা করেছি ভর্তি হয় ArrayListসঙ্গে nullএবং তারপর উপরে করছেন। এটি কাজ করে তবে আমি মনে করি এটি একটি ভয়াবহ সমাধান। এই কাজ করার জন্য অন্য উপায় আছে কি?


7
আপনি একটি সূচিপত্র ছাড়াই অনুগ্রহ পান কারণ তালিকাটি খালি এবং আপনি যে তালিকার অস্তিত্ব নেই তার তালিকায় অ্যাক্সেস করতে পারবেন না ...
ভিক

1
নাল বস্তু দিয়ে তালিকাটি পূরণ না করে সেই অবস্থান তৈরি করার কোনও উপায় আছে কি? আমার কাছে মনে হচ্ছে এটি সত্যিই এক অদ্ভুত সমাধান।
জে মায়েস

1
আমি এটি মনে করি না ... যদি আপনাকে কোনও এলোমেলোভাবে ক্রমগুলিতে যুক্ত করতে হয় তবে আপনাকে এটি করার আরও একটি উপায় সন্ধান করতে হবে .. উদাহরণস্বরূপ একটি সাধারণ অ্যারে সহ: 'অবজেক্ট []' এবং তারপরে আপনার উচিত হবে না এটি পূরণ করতে হবে না, কেবল সূচনা করতে হবে
ভিক

1
@ ম্যাথোর্টজি এটি সত্যিই একটি বিস্ময়কর সমস্যা নয়। বিচ্ছিন্ন তালিকার সন্ধান করুন, রেফারেন্স.ওয়লফ্রাম / ম্যাটেম্যাটিকা / টিউটোরিয়াল /… একটি ভাল নিবন্ধ বলে মনে হচ্ছে। জাভাতে, কী হিসাবে সূচী সহ একটি মানচিত্র সম্ভবত সহজ পদ্ধতির হতে পারে।
দুর্বল পরিবর্তনশীল

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 কিছু যোগ করতে পারেন মত মনে হচ্ছে না যখন অবস্থান 2. কোন অবজেক্ট
জে Maes

সংক্ষিপ্ত তবে সর্বাধিক উত্তর। অন্যরা কেবল ভুল পথে রয়েছে
শাব্বির ধনগোট

একটি গঠনমূলক যুক্তি!
আরসাল ইমাম

31

আপনি অবজেক্টের অ্যারে ব্যবহার করতে এবং এটিকে অ্যারেলিস্টে রূপান্তর করতে পারেন

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

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

অ্যারেলিস্টটি হবে- [১, নাল, ২, ৩, নাল, নাল, নাল, 7, নাল, নাল]


2
একটি অপূর্ণতা হ'ল আপনাকে আকারটি আগেই জানতে হবে।
ড্যানিয়েল হুরি

17

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

Object[] list = new Object[10];

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

আপনি সক্ষমতা উদ্ভাবন করেছেন, তবে 'অ্যারেলিস্ট' এর আকার নয়। আকারটি উপাদানগুলির সংখ্যার হিসাবে সংজ্ঞায়িত করা হয়, এবং
ভিক

@ ভিক, আমি প্রথমে প্রশ্নটি ভুলভাবে পড়েছি, তবে টিপটির জন্য ধন্যবাদ।
মেডোপাল

আমি ক্ষমতাটি 10 ​​তে শুরু করেছিলাম, তবে এখনও কোনও অবজেক্ট যুক্ত করার সময় আমি একটি সূচকআউটআউটবাউন্ডসেক্সপোটন পাই। নিশ্চিতকরণের ক্ষমতা সহ ক্ষমতা পরিবর্তন করার ক্ষেত্রেও একই। কেবলমাত্র যা কাজ করে তা এই মুহুর্তে
শূন্যতার সাথে পূর্ণ হয়

"আকার" এবং "ক্ষমতা" এর মধ্যে পার্থক্য জন্য @Maethortje লুক ... ব্যতিক্রম আসে যখন সূচক> আকার, যখন না হয়> ধারণক্ষমতা ..... হয়
ভিক

ছেলেরা যেমন উল্লেখ করেছে, আপনি সূচক 3 এ কোনও বস্তু যুক্ত করছেন, যখন তালিকার আকার এখনও 1 1. এটি সম্ভব নয়। নির্দিষ্ট সূচিতে যোগ করার পদ্ধতি হিসাবে এই সূচক, তালিকা সীমানা ভিতরে উদাহরণস্বরূপ যতদিন অনুমোদিত কিনা আপনি তা আপনার তালিকার 3 অবজেক্ট আছে, তাই না একটি বস্তু সূচক 100 এ যোগ করতে পারেন
medopal

14

আপনি নিজের আকার এবং যে উপাদানটি যোগ করতে চান তার মধ্যে নালগুলি সন্নিবেশ করানোর জন্য আপনি অ্যারেলিস্টকে ওভাররাইড করতে পারেন।

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

তারপরে আপনি অ্যারেলিস্টের যে কোনও পয়েন্টে যুক্ত করতে পারেন। উদাহরণস্বরূপ, এই প্রধান পদ্ধতি:

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 তে কোনও উপাদান না থাকলেও ...
ভিক

@ এটি একটি অপ্রয়োজনীয় তালিকা - প্রশ্নটিতে আমার মন্তব্য দেখুন।
দুর্বল পরিবর্তনশীল


2
@Maethortje 

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

নির্দিষ্ট অবস্থানে একটি উপাদান যুক্ত করার চেষ্টা করার সময় আপনি সূচক-আউটবাউন্ড পেয়েছেন, সুতরাং তালিকার তাদের অবস্থানে কিছু উপাদান থাকা উচিত।

নিম্নলিখিত চেষ্টা করুন

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


1

আমি মনে করি মেডোপাল থেকে সমাধান আপনি যা খুঁজছেন তা is

তবে কেবলমাত্র অন্য একটি বিকল্প সমাধান হ্যাশম্যাপ ব্যবহার করা এবং অবস্থানগুলি সঞ্চয় করতে কী (পূর্ণসংখ্যা) ব্যবহার করা।

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


চাবি দিয়ে অর্ডার করার পরেও ট্রিম্যাপ কি আরও ভাল নয়?
ড্যানিয়েল হুরি

1

মনে করুন আপনি কোনও অবস্থাতে কোনও আইটেম যুক্ত করতে চান, তবে তালিকার আকার অবশ্যই পজিশনের চেয়ে বেশি হওয়া উচিত।

add(2, item): এই বাক্য গঠনটির অর্থ, পুরাতন আইটেমটি পরবর্তী সূচকে 2 পজিশনে নিয়ে যান এবং আইটেমটি ২ য় স্থানে যুক্ত করুন।

যদি ২ য় অবস্থানে কোনও আইটেম না থাকে, তবে এটি কাজ করবে না, এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।

এর অর্থ যদি আপনি কিছু যুক্ত করতে চানposition 2,

আপনার তালিকার আকার অবশ্যই কমপক্ষে হওয়া উচিত (2 + 1) =3,যাতে আইটেমগুলি পাওয়া যায়0,1,2 Position.

সেই পথে এটি নিশ্চিত করা হয় যে পজিশনটি 2 নিরাপদে অ্যাক্সেস করা হয়েছে এবং এর ব্যতিক্রম হবে না।


2
আমি যখন আপনার উত্তরটি অবহিত করেছি তখন আমি কেবল তার মধ্য দিয়ে যাচ্ছি ... আসলে, আমরা নতুন আইটেমটি সন্নিবেশ করানোর মুহুর্তে তালিকার প্রকৃত দৈর্ঘ্যের তুলনায় সূচকটি অবশ্যই কম বা সমান হবে । এক্সাম্পল: তালিকার আকার 2: সূচক 2 যুক্ত করে কাজ করবে। সূচক 3 যুক্ত করা একটি ব্যতিক্রম ছুঁড়ে ফেলবে। (এটি পরীক্ষা করা হয়েছিল)
হউসেম ক্ল্লেউ

0

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


0

বিট দেরিতে তবে আশা করি এখনও কারও কাজে লাগতে পারে।

আইনে একটি নির্দিষ্ট অবস্থানে আইটেম যুক্ত করতে 2 পদক্ষেপ ArrayList

  1. add একটি নির্দিষ্ট সূচীতে নাল আইটেম একটি 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);

এটি বিদ্যমান আইটেমগুলিকে কেবল অবস্থানে ওভাররাইট করবে না , বিদ্যমানগুলিকে একের পর এক ডানদিকে সরিয়ে দেবে - সুতরাং আপনার দ্বিগুণ সংকেত সহ একটি অ্যারেলিস্ট রয়েছে।


0

আপনার সূচকে বিদ্যমান মান প্রতিস্থাপন করতে যোগ করার পরিবর্তে সেট করা উচিত।

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

তালিকায় [অবজেক্ট 1, অবজেক্ট 2] থাকবে

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