জাভাতে পরিবর্তনশীল দৈর্ঘ্য (গতিশীল) অ্যারে


108

আমি ভাবছিলাম যে কীভাবে কোনও পূর্ণসংখ্যার অ্যারের সূচনা করা যায় যে এটির আকার এবং মানগুলি আমার প্রোগ্রামটি কার্যকর করার মাধ্যমে কোনও প্রস্তাবনা দিয়ে পরিবর্তন করতে পারে?

উত্তর:


121

হ্যাঁ: অ্যারেলিস্ট ব্যবহার করুন ।

জাভাতে, "সাধারণ" অ্যারেগুলি স্থির-আকারের হয়। আপনাকে তাদের একটি আকার দিতে হবে এবং সেগুলি প্রসারিত বা চুক্তি করতে পারে না। আকার পরিবর্তন করতে আপনাকে একটি নতুন অ্যারে তৈরি করতে হবে এবং আপনার যে ডেটা চান তা অনুলিপি করতে হবে - যা অদক্ষ এবং আপনার জন্য ব্যথা।

ভাগ্যক্রমে, এখানে সমস্ত ধরণের অন্তর্নির্মিত ক্লাস রয়েছে যা সাধারণ ডেটা স্ট্রাকচার প্রয়োগ করে এবং অন্যান্য দরকারী সরঞ্জামগুলিও। তাদের পুরো তালিকার জন্য আপনি জাভা 6 এপিআই চেক করতে চাইবেন ।

একটি সতর্কতামূলক: অ্যারেলিস্ট কেবলমাত্র বস্তুগুলি ধরে রাখতে পারে (উদাহরণস্বরূপ পূর্ণসংখ্যার), আদিম নয় (যেমন ints)। বেশিরভাগ ক্ষেত্রে, অটোবক্সিং / স্বতঃবক্সিং আপনার জন্য নিঃশব্দে যত্ন নেবে তবে আপনি যা করছেন তার উপর নির্ভর করে আপনি কিছু অদ্ভুত আচরণ পেতে পারেন।


2
আমি ভাবছি কেন নীচের কোডটি জাভাতে সঠিক? int[] array = new int[size]; sizeএকটি পরিবর্তনশীল, কিন্তু একটি অ্যারের দৈর্ঘ্য সংশোধন করা আবশ্যক, আমি ডান @Lord Torgamus আছি?
jerry_sjtu

12
@ জেরি_সজ্টু হ্যাঁ, sizeপ্রোগ্রামটি চলার সাথে সাথে অ্যারেটি মাপতে আকার পরিবর্তন করে না ; এটি sizeযখন লাইনটি কার্যকর করা হয় তখন আকারটি যা ঘটে তা পায় ।
পোপগুলি

আমি যখনই কোনও অ্যারেলিস্ট থেকে কোনও আইটেম সরিয়ে ফেলি, আমি শেষে একটি nullদিয়ে শেষ করি। কোন ধারণা কেন?
অ্যারন ফ্র্যাঙ্ক

37

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

পরিবর্তে

Integer[] ints = new Integer[x]

তুমি ব্যাবহার কর

List<Integer> ints = new ArrayList<Integer>();

তারপরে আপনি যে তালিকাটি ব্যবহার করছেন তার তালিকা পরিবর্তন করতে ints.add(y)এবং ints.remove(z)অন্যান্য অনেকগুলি সহজ পদ্ধতির মধ্যে আপনি উপযুক্ত জাভাদোকগুলিতে খুঁজে পেতে পারেন।

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


আমি চেষ্টা না করা পর্যন্ত কাজ করতে চাই: তালিকা <Integer> ints = নতুন অ্যারেলিস্ট <Integer> ();
gorbysbm

5
আপনি List<Integer>পরিবর্তে ব্যবহার করবেন না কেন ArrayList<Integer>?
ডিন মিহান

24

অ্যারেগুলি একবার তাত্ক্ষণিকভাবে স্থির আকারের হয়। পরিবর্তে আপনি একটি তালিকা ব্যবহার করতে পারেন।

অটোবক্সিং একটি তালিকাটিকে একটি অ্যারের অনুরূপ ব্যবহারযোগ্য করে তোলে, আপনি এটিতে কেবল ইনট-মান রাখতে পারেন:

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

2
আপনি তালিকা তালিকার একটি রেফারেন্স ভেরিয়েবল ঘোষণা করেন, এবং অ্যারেলিস্ট না কেন?
LppEdd

2
কারণ এটি প্রয়োজন হলে তালিকা-বাস্তবায়নগুলির মধ্যে সহজভাবে পরিবর্তন করতে দেয়, আপনাকে কেবল নতুন এক্সওয়াইজেডলিস্ট () পরিবর্তন করতে হবে। যদি ভেরিয়েবলটিকে অ্যারেলিস্ট হিসাবে ঘোষিত করা হয় oyu এই প্রয়োগের জন্য নির্দিষ্ট পদ্ধতিগুলি ব্যবহার করতে পারে, একটি পরিবর্তন আরও জটিল করে তোলে।
মেনিমেথ

1
ধন্যবাদ, আমি বুঝতে পেরেছি।
LppEdd

11

আমি আগের উত্তর পরামর্শ সঙ্গে মতানৈক্য ArrayList, কারণ ArrayListহয় না ডাইনামিক এরে কিন্তু একটি তালিকা সমর্থিত একটি অ্যারের দ্বারা। পার্থক্যটি হ'ল আপনি নিম্নলিখিতটি করতে পারবেন না:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

এটি আপনাকে একটি সূচকআউটআউটবাউন্ডসেক্সপশন দেবে কারণ এই অবস্থানটিতে এখনও কোনও উপাদান নেই যদিও ব্যাকিং অ্যারে যেমন যুক্ত করার অনুমতি দেয়। সুতরাং আপনার @ কপিরাইট-লেন্স প্রস্তাবিত কাস্টম এক্সটেন্ডেবল অ্যারে বাস্তবায়ন ব্যবহার করতে হবে


আমি বিশ্বাস করি আপনি এটিকে কোডরেপ্লাই.ইনসওয়ার
অমিত কুমার গুপ্ত

আমি নিশ্চিত নই যে জাভা 8 উত্স কোডে অ্যারেলিস্টের কোনও পুট পদ্ধতি রয়েছে কিনা। প্রদত্ত ক্ষমতা সহ এটি কীভাবে আচরণ করে তা সন্ধান করার চেষ্টা করছি। তবে অ্যারেলিস্ট.এডডি () পদ্ধতিটি পাওয়া গেছে।
সঞ্জিত এ

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

উত্স: ডায়নামিক অ্যারে কীভাবে করা যায়


7
  1. এটি ছোট স্কেল আকারের সাথে ডিল করতে তালিকা ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।

  2. আপনার যদি বিপুল সংখ্যক সংখ্যা থাকে তবে কখনও তালিকা এবং অটোবক্সিং ব্যবহার করবেন না ,

    <পূর্ণসংখ্যা> তালিকা

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

int[] array = new int[ESTIMATED_SIZE];


4

আপনি কোনও অ্যারের আকার পরিবর্তন করতে পারবেন না। তবে আপনি সঠিক মাপের সাথে একটি নতুন অ্যারে তৈরি করতে এবং পুরানো অ্যারে থেকে নতুনটিতে ডেটা অনুলিপি করতে পারেন।

তবে আপনার সেরা বিকল্পটি হল জাকার্তা কমন্স থেকে ইন্টলিস্ট ব্যবহার করা। ( এখানে )

এটি কেবল একটি তালিকার মতো কাজ করে তবে কম স্থান নেয় এবং এর চেয়ে বেশি দক্ষ, কারণ এটি ইনট এর উপর র‌্যাপার বস্তুগুলি সংরক্ষণের পরিবর্তে ইনট এর সঞ্চয় করে (এটি পূর্ণসংখ্যা শ্রেণিটি কী)।


-4

আমি এই প্রশ্নের উত্তর দিয়েছি এবং না আপনার কোনও অ্যারেলিস্ট বা অন্য কোনও জিনিসের দরকার নেই এটি একটি অ্যাসাইনমেন্ট ছিল এবং আমি এটি সম্পন্ন করেছি যাতে হ্যাঁ অ্যারেগুলি আকারে বাড়তে পারে। এখানে লিঙ্ক জাভা ডায়নামিক এরে কীভাবে ব্যবহার করতে হয় এবং এখানে আমার প্রশ্ন যা আমি উত্তর দিলাম জন্য লিঙ্ক জাভা ডায়নামিক অ্যারে


1
এটা ঠিক ভুল। লিঙ্কযুক্ত উত্তরটি System.arrayCopy () কে কল করে, বর্ধিত আকারের সাহায্যে পুরানো অ্যারেটি অনুলিপি করে নতুন এন্ট্রি যুক্ত করে। অ্যারেগুলিতে এখনও একটি গতিশীল আকার থাকতে পারে না।
katzenhut
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.