অ্যারেলিস্টের জন্য প্রাথমিক আকার


257

আপনি একটি অ্যারেলিস্টের জন্য প্রাথমিক আকারটি সেট করতে পারেন

ArrayList<Integer> arr=new ArrayList<Integer>(10);

তবে, আপনি পারবেন না

arr.add(5, 10);

কারণ এটি সীমার বাইরে ব্যতিক্রম ঘটায়।

আপনার বরাদ্দ করা স্থানটি অ্যাক্সেস করতে না পারলে প্রাথমিক আকার নির্ধারণের ব্যবহার কী?

অ্যাড ফাংশনটি হিসাবে সংজ্ঞায়িত করা হয়েছে add(int index, Object element)তাই আমি সূচি 10 তে যুক্ত করছি না।


52
প্রকৃতপক্ষে, ডক্স থেকে এটি সুস্পষ্ট নয় যে আপনি তালিকাটিতে কমপক্ষে এন আইটেম যুক্ত করা দরকার এন -1set/add আইটেম করার আগে ।
ধারণা

5
উপলব্ধি: আমি জানি না এটি সুস্পষ্ট কিনা, তবে এটি নির্দিষ্ট করা আছে। একজনকে জাভাক ডকটি সাবধানে পড়তে হবে h
ন্যাটিক্স 17'12

3
এইচএম, নির্মাতা বলেছেন "নির্দিষ্ট প্রাথমিক ক্ষমতা সহ একটি খালি তালিকা তৈরি করে।", খালি তালিকার ধারণাটি গ্রহণ করে, একটি সূচক 5 থাকতে পারে না তবে আমি সম্মত
হই

12
আমার কাছে মনে হয় এটিও ন্যায়সঙ্গত যে আপনি যদি একটি নির্দিষ্ট মানকে একটি অ্যারের সূচনা করেন তবে আপনি সেই মানটির চেয়ে কম সূচকগুলি ধরে নেবেন this এবং এটি একটি ArrayList। আমি ব্যক্তিগতভাবে এমন একটি পদ্ধতি চাই যা আমাকে এমন একটি আকার নির্ধারণ করতে দেয় যাতে আমি নির্দিষ্ট সূচকগুলিতে জিনিসগুলি রাখতে পারি। এই পদ্ধতিটি উল্লেখযোগ্যভাবে অনুপস্থিত বলে মনে হচ্ছে।
অ্যান্ড্রু ওয়াইল্ড

1
নাম্বস্কুল কীভাবে সংগ্রহগুলি এইভাবে ডিজাইন করেছিলেন ?! এই পরিবর্তনশীল দৈর্ঘ্যের উপাদানগুলির সাথে কাঠামোর সমান্তরাল তাত্ক্ষণিক জন্য উদার কাজকে বাধ্য করে (যেমন অ্যারেলিস্ট <স্ট্রিং []> যেখানে প্রতিটি অ্যারের আলাদা দৈর্ঘ্য থাকতে পারে)। যদি মেমরিটি ইতিমধ্যে বরাদ্দ করা হয় তবে এন উপাদানগুলি যুক্ত করার পরে তালিকার পুনরায় স্থানের প্রয়োজন নেই, সেই সূচকগুলি শুরু থেকে সরাসরি অ্যাক্সেসযোগ্য হওয়া উচিত। সি / সি ++, সি #, অবজেক্টিভ সি এবং সুইফটের পরে ওরাকলে কেউ এই প্যাটার্নটি শিখেনি ?!
patrickjp93

উত্তর:


387

আপনি তার ক্ষমতা সহ অ্যারের তালিকার আকারটিকে বিভ্রান্ত করছেন:

  • আকার তালিকায় উপাদানের সংখ্যা হয়;
  • ধারণক্ষমতা কতগুলি উপাদান তালিকা সম্ভাব্য অভ্যন্তরীণ কাঠামো reallocating ছাড়া মিটমাট করতে পারেন।

আপনি যখন ফোন করবেন new ArrayList<Integer>(10), আপনি তালিকার আকার নয়, তালিকার প্রাথমিক ক্ষমতাটি সেট করছেন । অন্য কথায়, এই পদ্ধতিতে তৈরি করা হলে অ্যারের তালিকাটি খালি জীবন শুরু করে।

অ্যারে তালিকায় দশটি উপাদান যুক্ত করার একটি উপায় হ'ল লুপ ব্যবহার করে:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

এটি সম্পন্ন করার পরে, আপনি এখন সূচক 0..9 এ উপাদানগুলি পরিবর্তন করতে পারেন।


51
+1: একটি সংক্ষিপ্ত লুপ while(arr.size() < 10) arr.add(0);এটি আকারে কমপক্ষে হওয়া দরকার বলে মনে হয় কার্যকর 10। উদাহরণস্বরূপ যাতে আপনি ব্যবহার করতে পারেনarr.set(9, n);
পিটার ল্যারি

10
+1: দুর্দান্ত প্রতিক্রিয়া, আমি পারলে +10 দেব। এপিআই থেকে তাত্ক্ষণিকভাবে স্পষ্ট হয় না যে আপনি কেন একক কনস্ট্রাক্টর কলটিতে প্রাথমিক আকার এবং প্রাথমিক ক্ষমতা উভয় সেট করতে পারবেন না। আপনার
বাছাইটি এপিআইয়ের

@ পিটারলাউরে আপনার কোডটি সংক্ষিপ্ত হতে পারে তবে এতে কেবল একটির চেয়ে লুপের পুনরাবৃত্তির জন্য দুটি পদ্ধতি কল রয়েছে।
নিউরালমার

@ নিউরালমার আমি আকার () আশা করব এবং যুক্ত করব) যাতে ইনলাইন করা হবে যাতে রানটাইমের সময় কোনও আসল পদ্ধতি কল আসে না।
পিটার লরে

109

আপনি যদি পূর্বনির্ধারিত আকারের একটি তালিকা চান তবে আপনি এটি ব্যবহার করতে পারেন:

List<Integer> arr = Arrays.asList(new Integer[10]);

11
এখানে সামান্য অসুবিধা, ফলাফলটি Listশূন্যতায় পূর্ণ। পেয়ারা দিয়ে আমরা এটি করতে পারি Ints.asList(new int[10])যা আমাদের তালিকাগুলির সাথে সূচনা করবে 0। পরিষ্কার প্যাটার্ন যদিও, উদাহরণের জন্য ধন্যবাদ।
dimo414

1
অ্যারেলিস্ট <E> সম্পর্কে প্রশ্নগুলি আলোচনা করে। আপনি তালিকা <E> ব্যবহার করছেন। কেউ তা পর্যবেক্ষণ করেনি ??? তদুপরি, তারা এই অপ্রাসঙ্গিক উত্তরটিকে উড়িয়ে দিয়েছে ! আমি আপনার জবাবটিকে কমানোর কারণ আমি কখনই করি না। সোজা ... গডসেক!
অ্যাপোস্টোলোস

3
@ অ্যাপোস্টোলোস ArrayListহল Listইন্টারফেসের একটি বাস্তবায়ন এবং Arrays.asListএকটি প্রদান করে ArrayList। আমি আপনাকে বহুবর্ষিতা সন্ধান করার পরামর্শ দিচ্ছি।
লিয়াম পটার

এটি স্থির আকারের সাথে একটি তালিকা ফেরত দেয়। আরও উপাদান নিক্ষেপ করার চেষ্টা করছেUnsupportedOperationException
কোরাই তুগায়

47

আপনি যদি কালেকশন.ফিল ব্যবহার করতে চান (তালিকা, আপত্তি); পুনরাবৃত্তি বস্তুর সাথে তালিকাটি পূরণ করতে বিকল্পভাবে আপনি ব্যবহার করতে পারেন

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

লাইনটি আপনার অ্যারেলিস্টে 10 বার 0 অনুলিপি করে


20

ক্যাপাসিটি একটি এর ArrayListতার হিসাবে একই নয় আকারআকারটিArrayList (এবং অন্য কোনও Listবাস্তবায়ন) এর মধ্যে থাকা উপাদানের সংখ্যার সমান ।

ধারণক্ষমতা মাত্র অন্তর্নিহিত অ্যারে যা internaly উপাদান সংরক্ষণ করা হয় এর দৈর্ঘ্য হল ArrayList, এবং সবসময় বড় বা সমান আকার তালিকার।

set(index, element)তালিকায় কল করার সময় তালিকার indexউপাদানগুলির (= আকার) প্রকৃত সংখ্যার সাথে সম্পর্কিত (যা আপনার কোডের শূন্য, সুতরাং AIOOBEনিক্ষিপ্ত হয়), অ্যারের দৈর্ঘ্যের সাথে নয় (= ক্ষমতা) (যা বাস্তবায়নের বিশদ নির্দিষ্ট যাও ArrayList)।

setপদ্ধতি সাধারণ সব থেকে Listযেমন বাস্তবায়নের, LinkedList, যা আসলে একটি অ্যারের দ্বারা বাস্তবায়িত হয়নি, কিন্তু এন্ট্রির একটি লিঙ্ক শৃঙ্খল হিসাবে।

সম্পাদনা : আপনি আসলে add(index, element)পদ্ধতিটি ব্যবহার করেন , না set(index, element), তবে নীতিটি এখানে একই।


10

আপনি যদি সূচকের সাথে উপাদানগুলি যুক্ত করতে চান তবে আপনি পরিবর্তে একটি অ্যারে ব্যবহার করতে পারেন।

    String [] test = new String[length];
    test[0] = "add";

5
ওপি প্রাথমিকভাবে একটি তালিকা ব্যবহার করতে চেয়েছিল ... একটি অ্যারে নয়।
স্টিফান

9

10 হ'ল আ.ল. এর প্রাথমিক ক্ষমতা, আকার নয় (যা 0)। যখন আপনি প্রচুর পরিমাণে উপাদান পেতে যাচ্ছেন তখন আপনার প্রাথমিক ক্ষমতাটি কিছু উচ্চ মানের সাথে উল্লেখ করা উচিত, কারণ এটি উপাদান যুক্ত করতে থাকায় ক্ষমতা বাড়ানোর ওভারহেড এড়ানো হয়।


6

আমি অনুমান করি আপনার প্রশ্নের সঠিক উত্তরটি হ'ল:

একটি অ্যারেলিস্টে অন্তর্নিহিত আকার নির্ধারণ করা এনআরআরকে হ্রাস করে। বারবার অভ্যন্তরীণ মেমরি পুনঃ-বরাদ্দ হতে হবে। তালিকাটি একটি অ্যারের দ্বারা ব্যাক করা হয়। আপনি যদি প্রথম শ্রেণীর মান 0 নির্দিষ্ট করে থাকেন তবে ইতিমধ্যে কোনও উপাদানটির প্রথম সন্নিবেশের সময় অভ্যন্তরীণ অ্যারেটিকে পুনরায় আকার দিতে হবে। আপনার তালিকায় কতগুলি উপাদান রয়েছে সে সম্পর্কে যদি আপনার কাছে আনুমানিক ধারণা থাকে তবে প্রাথমিক ক্ষমতা নির্ধারণের ফলে এনআরআর হ্রাস পাবে। আপনি তালিকাটি ব্যবহার করার সময় পুনরায় বরাদ্দ মেমরির।



3

এটিতে দেরি হয়ে গেলেও জাভা 8 এর পরে আমি ব্যক্তিগতভাবে Streamএপিআইয়ের সাথে নিম্নলিখিত পদ্ধতিটি আরও সংক্ষিপ্ত দেখতে পাই এবং গৃহীত উত্তরের বিকল্প হতে পারে

উদাহরণ স্বরূপ,

Arrays.stream(new int[size]).boxed().collect(Collectors.toList())

sizeকাঙ্ক্ষিত Listআকার এবং এখানে উল্লিখিত অসুবিধা ছাড়াই কোথায় , এর সমস্ত উপাদান Listহিসাবে সূচনা করা হয়েছে 0

(আমি একটি দ্রুত অনুসন্ধান করেছি এবং streamপোস্ট হওয়া কোনও উত্তর দেখিনি - এই উত্তরটি অপ্রয়োজনীয় কিনা তা আমাকে নির্দ্বিধায় জানান এবং আমি এটিকে সরাতে পারি))


1

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

শুধু কল:

arr.add(10)

আপনার অ্যারেলিস্টে পূর্ণসংখ্যা যোগ করতে


1

যদিও আপনার অ্যারেলিস্টের ক্ষমতা 10 রয়েছে, আসল তালিকার এখানে কোনও উপাদান নেই। অ্যাড পদ্ধতিটি আসল তালিকায় একটি উপাদান sertোকাতে ব্যবহৃত হয়। যেহেতু এর কোনও উপাদান নেই তাই আপনি 5 এর সূচিতে কোনও উপাদান sertোকাতে পারবেন না।


1

আপনি যদি আপনার 10 টি আইটেম যুক্ত করতে চান তবে ArrayListআপনি এটি চেষ্টা করতে পারেন:

for (int i = 0; i < 10; i++)
    arr.add(i);

আপনি যদি ইতিমধ্যে একটি অ্যারের আকারের ভেরিয়েবল ঘোষণা করে থাকেন তবে আপনি size'10' সংখ্যার পরিবর্তে চলকটি ব্যবহার করবেন


1

আমি অনুরূপ ইস্যুটির মুখোমুখি হয়েছি এবং অ্যারেলিস্টটি জেনে রাখা তালিকা তালিকার ইন্টারফেসের একটি পরিবর্তনযোগ্য-অ্যারে বাস্তবায়ন, আমিও আশা করি আপনি যে কোনও পয়েন্টে উপাদান যুক্ত করতে পারবেন, তবে প্রাথমিক আকারটি সংজ্ঞায়নের বিকল্প থাকতে পারে। যাইহোক, আপনি প্রথমে একটি অ্যারে তৈরি করতে পারেন এবং এটিকে তালিকায় রূপান্তর করতে পারেন:

  int index = 5;
  int size = 10;

  Integer[] array = new Integer[size];
  array[index] = value;
  ...
  List<Integer> list = Arrays.asList(array);

অথবা

  List<Integer> list = Arrays.asList(new Integer[size]);
  list.set(index, value);

0

অ্যারেলিস্ট মাইলিস্ট = নতুন অ্যারেলিস্ট (10);

//  myList.add(3, "DDD");
//  myList.add(9, "III");
    myList.add(0, "AAA");
    myList.add(1, "BBB");

    for(String item:myList){
        System.out.println("inside list : "+item);
    }

/ * অ্যারেলিস্টের প্রাথমিক ক্যাপাসিটি ঘোষণা করুন অভ্যন্তরীণভাবে স্থানান্তরিত সময় বাঁচানো ছাড়া কিছুই নয়; আমরা যখন উপাদানটি অভ্যন্তরীণভাবে যুক্ত করি তখন ক্যাপাসিটি বাড়াতে ক্যাপাসিটিটি পরীক্ষা করে, আপনি প্রাথমিকভাবে সূচক 0 এবং পরে আরও 1 যুক্ত করতে পারেন। * /


0

আমার দুটি সেন্ট Stream। আমি মনে করি এটি ব্যবহার করা ভাল

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());

কোনও প্রাথমিক মান রাখার নমনীয়তা সহ।

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