সমস্ত অ্যারে উপাদান শূন্যে আরম্ভ করার জন্য কোনও শর্টকাট?


281

ইন C/C++আমি কি করতে ব্যবহৃত

int arr[10] = {0};

... আমার সমস্ত অ্যারে উপাদানগুলি 0 তে আরম্ভ করার জন্য।

জাভাতে কি একই রকম শর্টকাট আছে?

আমি লুপটি ব্যবহার এড়াতে চাই, এটা কি সম্ভব?

int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
    arr[i] = 0;
}

2
java.util.Arrays.fill () int [] arr = new int [10]; এবং int arr [10] = {0}; সমস্ত অভ্যন্তরীণ লুপ ব্যবহার করে।
কেভিন কোস্টলান

উত্তর:


574

অবিচ্ছেদ্য ধরণের অ্যারেগুলির জন্য 0 এর একটি ডিফল্ট মান ভাষা অনুমানের দ্বারা গ্যারান্টিযুক্ত :

প্রতিটি শ্রেণীর ভেরিয়েবল, উদাহরণ পরিবর্তনশীল, বা অ্যারের উপাদানটি তৈরি করা হলে একটি ডিফল্ট মান দিয়ে শুরু করা হয় (§15.9, §15.10) [...] টাইপের ক্ষেত্রে int, ডিফল্ট মান শূন্য, অর্থাৎ, হয় 0।  

আপনি যদি এক-মাত্রিক অ্যারেটিকে অন্য কোনও মান দিয়ে শুরু করতে চান তবে আপনি java.util.Arrays.fill () অবশ্যই অভ্যন্তরীণভাবে একটি লুপ ব্যবহার করতে পারেন ) ব্যবহার করতে পারেন ।


@ মিশেলবার্গওয়ার্ড আমার পক্ষে সহায়ক উত্তর ছিল। লুপের সাথে তুলনা করে এটি করার কি একই খরচ হবে?
maytham-ɯɐɥʇʎɐɯ

@ maytham-ɯɐɥıλɐɯ: আপনি উত্স কোডটি দেখতে পারেন, এটি জেডিকে নিয়ে আসে। এটি হুবহু একই, পদ্ধতিতে পুরোপুরি স্বাভাবিক, লুপের জন্য সোজা সোজা ছাড়া কিছুই থাকে না।
মাইকেল বার্গওয়ার্ড

@ মিশেলবার্গওয়ার্ট স্থানীয় 2-মাত্রিক অ্যারের মান সম্পর্কে কী? এটি কি "অ্যারে উপাদান" এর আওতায় পড়ে?
i

Arrays.fillঅগত্যা একটি লুপ ব্যবহার করবেন না।
নাটস

@ নেটস: আপনি কি জাভা প্রয়োগের একটি উদাহরণ দিতে পারেন যা না?
মাইকেল বর্গওয়ার্ট

104

অন্য উত্তরগুলি সঠিক হওয়ার সাথে সাথে (পূর্বে অ্যারে মানগুলি ডিফল্টরূপে 0 তে শুরু হয়) আপনি যদি স্পষ্টভাবে তা করতে চান (উদাহরণস্বরূপ বলুন আপনি যদি 42 এর মান দিয়ে ভরাট অ্যারে চেয়েছিলেন) তবে আপনি ফিল () পদ্ধতিটি ব্যবহার করতে পারেন অ্যারেগুলির শ্রেণী:

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

বা আপনি যদি 1-লাইনারের অনুরাগী হন তবে আপনি Collections.nCopies()রুটিনটি ব্যবহার করতে পারেন :

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

আরারের মান দেবে:

[42, 42, 42]

(এটি যদিও Integerএবং না হলেও int, আপনার যদি আদিম ধরণের প্রয়োজন হয় তবে আপনি অ্যাপাচি কমন্সArrayUtils.toPrimitive() রুটিনকে মুলতবি করতে পারেন :

int [] primarr = ArrayUtils.toPrimitive(arr);

9
এক-liners, ভালো, কিন্তু List<Integer>করতে Integer[]করতে int[]? এটি কিছুটা বিশৃঙ্খল।
ধরদি

2
@ ধরডি শিওর, তবে সে কারণেই উত্তরে ২-লাইনের সংস্করণও রয়েছে (যদি আপনি "সংশ্লেষিত" ফ্যাক্টর সম্পর্কে উদ্বিগ্ন হন)।
অ্যাডাম পার্কিন

Arrays.fillপদ্ধতির সাহায্যে 2 ডি অ্যারে শুরু করার ফলে সমস্যা তৈরি হচ্ছে এবং ত্রুটি দেখা দেয়।
একেএস

39

জাভা সব উপাদান (আদিম পূর্ণসংখ্যা ধরনের byte short, int, long) 0 ডিফল্টরূপে ইনিশিয়ালাইজ করা হয়। আপনি লুপটি সংরক্ষণ করতে পারেন।


2
আমি মনে করি এটি আদিম ধরণের জন্য রয়েছে ?!
অলিপিমু পিওপি

1
ইন্টের মতো আদিম জাভা প্রকারগুলি আরম্ভ করা হয় না।
মিরকো এবার্ট

8
@ tfb785: এটি ভুল। মাইকেল বর্গওয়ার্ট দ্বারা উপরে উল্লিখিত হিসাবে: আদিম পূর্ণসংখ্যার প্রকার (সংক্ষিপ্ত, অভ্যন্তরীণ, দীর্ঘ) 0 এ শুরু করা হয়
আর্নে ডয়েশ

1
হ্যাঁ, ইন্ট [] এর মতো জাভা আদিমগুলির অ্যারে 0 দিয়ে শুরু করা হয়। না, একটি জাভা আদিম প্রকার 0 দিয়ে শুরু করা হয়নি
মিরকো এবার্ট

3
ঠিক আছে, যথাযথভাবে বলতে গেলে: আদিম শ্রেণীর সদস্য (এটি স্ট্যাটিক হোক বা না) 0 দিয়ে শুরু করা হয় স্থানীয় ভেরিয়েবলগুলি নয়।
আর্ন

23

কীভাবে এটি আপনার অ্যাপ্লিকেশনটির কার্যকারিতা হ্রাস করবে ....? অনুসরণ করুন।

জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে যে কোনও অবজেক্টের জন্য ডিফল্ট / প্রাথমিক মান অনুসরণ হিসাবে দেওয়া যেতে পারে।

টাইপ জন্য বাইট , ডিফল্ট মান হল শূন্য হলো, (বাইট) এর মান 0

টাইপ জন্য সংক্ষিপ্ত , ডিফল্ট মান হল শূন্য , যে (সংক্ষিপ্ত) মান 0

টাইপ জন্য int- এ , ডিফল্ট মান হল শূন্য , যে, 0

টাইপ জন্য দীর্ঘ , ডিফল্ট মান হল শূন্য , যে, 0L

টাইপ জন্য ভাসা , ডিফল্ট মান হল ইতিবাচক শূন্য , যে 0.0f

টাইপ জন্য ডবল , ডিফল্ট মান হল ইতিবাচক শূন্য , যে, 0.0d

টাইপ চরের জন্য , ডিফল্ট মান হ'ল শূন্য অক্ষর, অর্থাৎ ' \ u0000 ' '

টাইপ জন্য বুলিয়ান , ডিফল্ট মান হল মিথ্যা

জন্য সমস্ত রেফারেন্স ধরনের , ডিফল্ট মান হল নাল

এই সমস্ত বিবেচনা করে আপনার অ্যারে উপাদানগুলির জন্য শূন্য মানগুলির সাথে আরম্ভ করার দরকার নেই কারণ ডিফল্টরূপে সমস্ত অ্যারে উপাদানগুলি ইনট অ্যারের জন্য 0 হয়।

কারণ একটি অ্যারে হ'ল একটি ধারক বস্তু যা একক ধরণের মানের একটি নির্দিষ্ট সংখ্যক ধারণ করে। এখন আপনার জন্য অ্যারের প্রকারটি অন্তর্নিহিত তাই বিবেচনা করুন সমস্ত অ্যারে উপাদানগুলির জন্য ডিফল্ট মানটি স্বয়ংক্রিয়ভাবে 0 হবে কারণ এটি int টাইপ করে

এখন বিবেচনা অ্যারের জন্য স্ট্রিং টাইপ যাতে সব অ্যারের উপাদানগুলি নেই ডিফল্ট মান হল নাল

কেন করবেন না ......?

আপনি আপনার প্রশ্নে পরামর্শ হিসাবে লুপ ব্যবহার করে নাল মান নির্ধারণ করতে পারেন।

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

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

মেশিন চক্রের বেশি ব্যবহার ==> ডেটা প্রক্রিয়া করার জন্য আরও সময় ==> আউটপুট সময় উল্লেখযোগ্যভাবে বৃদ্ধি পাবে । যাতে আপনার অ্যাপ্লিকেশন ডেটা প্রক্রিয়াকরণটিকে নিম্ন স্তরের হিসাবে বিবেচনা করা যায় (কিছু স্তরে ধীর গতিতে)।


17

আপনি লুপটি সংরক্ষণ করতে পারেন, ইনিশিয়ালাইজেশন ইতিমধ্যে 0 এ তৈরি করা হয়েছে এমনকি স্থানীয় ভেরিয়েবলের জন্যও।

তবে দয়া করে পড়ার যোগ্যতার জন্য আপনি যেখানে বন্ধনী স্থাপন করেছেন সেই স্থানটি সংশোধন করুন (স্বীকৃত সেরা অনুশীলন):

int[] arr = new int[10];

14

আপনি যদি ভাসা বা পূর্ণসংখ্যার ব্যবহার করে থাকেন তবে আপনি এর মতো ডিফল্ট মান নির্ধারণ করতে পারেন ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));

6

আপনি আপনার বিদ্যমান অ্যারে আকারের সাথে একটি নতুন খালি অ্যারে তৈরি করতে পারেন এবং আপনি সেগুলি আপনার অ্যারেতে পুনরায় বরাদ্দ করতে পারেন। এটি অন্যদের তুলনায় দ্রুত হতে পারে। Snipet:

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

ফলাফল :

0
0
0
0
0    
0
0
0
0

1

হ্যাঁ, একটি অ্যারেতে থাকা মানগুলি শূন্যের দিকে শুরু হয়। তবে আপনি এটির গ্যারান্টিযুক্ত নন। ওরাকল ডকুমেন্টেশন বলে যে এটি একটি খারাপ কোডিং অনুশীলন।


জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন অনুযায়ী বিভাগ 15.10.2 অনুসারে যদি অ্যারে তৈরির ব্যতিক্রমের সাথে অ্যারে তৈরি করা হয় যা প্রাথমিক মানগুলি সরবরাহ করে না, তবে অ্যারের সমস্ত উপাদান অ্যারের উপাদান উপাদানটির জন্য ডিফল্ট মান থেকে শুরু করা হয় - যেমন 0 চরের ক্ষেত্রে []। এটি একটি গ্যারান্টি; ওরাকল এর উপর নির্ভর করা খারাপ অভ্যাস বলে বিবেচনা করে আমি বেশ অবাক হয়েছি।
আয়ান রবার্টসন

1

ইন্ট মানগুলি ইনিশিয়েশনের পরে ইতিমধ্যে শূন্য, যেমন প্রত্যেকটি উল্লেখ করেছে। আপনার যদি এমন পরিস্থিতি হয় যেখানে আপনার আসলে অ্যারের মানগুলি শূন্যতে সেট করতে হয় এবং এটি অনুকূল করতে চান, ব্যবহার করুন System.arraycopy:

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

এটি memcpyবেশিরভাগ বা সমস্ত জেআরই বাস্তবায়নে কভারগুলির নীচে ব্যবহার করে। নোট করুন যে এর মতো স্ট্যাটিকের ব্যবহার একাধিক থ্রেড সহ সুরক্ষিত, যেহেতু সবচেয়ে খারাপ পরিস্থিতি একাধিক থ্রেড zerosএকই সাথে পুনরায় প্রত্যাবর্তন করে, যা কোনও ক্ষতি করে না।

Arrays.fillঅন্যরা যেমন উল্লেখ করেছেন তেমন আপনিও ব্যবহার করতে পারেন । একটি স্মার্ট জেভিএম ব্যবহার Arrays.fill করতে পারেmemcpy , তবে সম্ভবত একটি জাভা লুপ এবং সীমানা যা পরীক্ষা করে।

অবশ্যই আপনার অপ্টিমাইজেশনের বেঞ্চমার্ক করুন।


1

জাভা 8 এর উপরে ল্যাম্বদা ব্যবহার করে আরও একটি পদ্ধতি

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);

1

সি / সিপিতে কোনও শর্টকাট নেই শূন্য সাবস্ক্রিপ্টের সাহায্যে সমস্ত অ্যারে শুরু করার জন্য।

  int arr[10] = {0};

তবে জাভাতে অ্যারেস.ফিল () নামে একটি যাদু সরঞ্জাম রয়েছে যা আপনার পছন্দের পূর্ণসংখ্যার সাহায্যে অ্যারেতে সমস্ত মান পূরণ করবে x

  import java.util.Arrays;

    public class Main
    {
      public static void main(String[] args)
       {
         int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
         Arrays.fill(ar, 10);
         System.out.println("Array completely filled" +                          
            " with 10\n" + Arrays.toString(ar));
   }
 }

1

শূন্যের ক্ষেত্রে প্রারম্ভিককরণের প্রয়োজন হয় না কারণ জাভাতে পূর্বনির্ধারিত মান শূন্য হয়। শূন্য ব্যতীত অন্যান্য মানগুলির জন্য প্রচুর java.util.Arraysঅপশন সরবরাহ করা হয়, সহজতমটি হল পূরণ পদ্ধতি।

int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));  //[-1, -1, -1, -1, -1 ]

int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]

আমরা শর্তের ভিত্তিতে মান পূরণ করতে চাইলে আমরা অ্যারে.সেটআল ()ও ব্যবহার করতে পারি:

int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);

int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]

0

ক্লাসে অ্যারেরকে উদাহরণ হিসাবে পরিবর্তনশীল হিসাবে ঘোষণা করুন অর্থাত্ প্রতিটি পদ্ধতির বাইরে এবং জেভিএম 0 টি ডিফল্ট মান হিসাবে দেবে। আপনার আর চিন্তা করার দরকার নেই


-3
    int a=7, b=7 ,c=0,d=0;
    int dizi[][]=new int[a][b];
    for(int i=0;i<a;i++){
        for(int q=d;q<b;q++){
            dizi[i][q]=c;               
            System.out.print(dizi[i][q]);
            c++;
        }

        c-=b+1;
        System.out.println();               
    }

ফলাফল 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-2-10

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