জাভাতে অন্য অ্যারে থেকে কীভাবে সাব অ্যারে তৈরি করবেন?


284

অন্য অ্যারে থেকে কীভাবে সাব-অ্যারে তৈরি করবেন? এমন কোনও পদ্ধতি আছে যা প্রথম অ্যারে থেকে সূচকগুলি গ্রহণ করে:

methodName(object array, int start, int end)

আমি লুপগুলি তৈরি এবং আমার প্রোগ্রামটিকে ক্ষতিগ্রস্থ করে তুলতে চাই না।

আমি ত্রুটি পেতে থাকি:

প্রতীক পদ্ধতি অনুলিপি খুঁজে পাবে না

এটি আমার কোড:

import java.util.*;

public class testing 
{
    public static void main(String [] arg) 
    {   
        int[] src = new int[] {1, 2, 3, 4, 5}; 
        int b1[] = Arrays.copyOfRange(src, 0, 2);
    }
}

উত্তর:


305

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

জেডিকে> ১. 1.5

Arrays.copyOfRange(Object[] src, int from, int to)

Javadoc

জেডিকে <= 1.5

System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 

Javadoc


3
আমার অ্যারেস.কপিঅফরেঞ্জে অবজেক্ট [] গুলি না রাখার বিষয়ে আমার কিছু সমস্যা ছিল। আপনি java.util.Ararays ব্যবহার করছেন তা নিশ্চিত করতে আপনার আমদানি পরীক্ষা করুন। কোনওভাবেই একটি ভিন্ন অ্যারে সংস্করণ আমদানি হয়ে গেছে এবং আমি ইস্যুটির জন্য জেআরই এবং জেডিকে চেক করতে 15 মিনিট নষ্ট করেছি।
নিউক্লিয়ারপিয়ন

@ নিউক্লিয়ার পিওন আপনাকে ধন্যবাদ !!! আমি নিজে নিজে এটি আবিষ্কার করার আগে আমাকে দীর্ঘ সময় দিতেন। গ্রহন স্বয়ংক্রিয়ভাবে আমদানি করা org.bouncycastle.util.Arrays
আন্ডেরো

136

Arrays.copyOfRange(..)জাভা 1.6 এ যুক্ত হয়েছিল। সুতরাং সম্ভবত আপনার সর্বশেষতম সংস্করণ নেই। যদি আপগ্রেড করা সম্ভব না হয় তবে দেখুনSystem.arraycopy(..)


1
@ সামি হয় হয় ১.6 এ আপগ্রেড করুন বা এই ডকুমেন্টটি দেখুন রেফারেন্সের জন্য ডাউনলোড
জিগার জোশী

4
কোন জেন্ডার আপনার জেডিকে? সান / ওরাকল কখনই 4.00.28 সংস্করণ প্রকাশ করেনি এবং গুগল এটির সন্ধানও করতে পারে নি।
পিটার লরি

copyOfRange একটি ছোট অ্যারে বরাদ্দের পরিবর্তে উত্স অ্যারে রেঞ্জের বাইরে থাকলে উপাদানগুলি পিছনে ফেলে দেয় :(
ড্যানেল এস ইয়াইটস্কভ

12
কারও উত্তরে যুক্ত করা উচিত যে "স্টার্ট-ইনডেক্স" অন্তর্ভুক্ত থাকাকালীন "শেষ সূচক" একচেটিয়া
ইয়ান কিং ইয়িন

@ ইয়ানকিংইন আপনি ঠিক বলেছেন - আমি ঠিক মন্তব্যগুলি পড়ছিলাম এই জন্যই :)
বেন কুশিগিয়ান


20

হ্যাঁ, একে System.arraycopy (অবজেক্ট, ইনট, অবজেক্ট, ইনট, ইনট) বলা হয়

এটি এখনও কোথাও কোনও লুপ সম্পাদন করতে চলেছে, যদি না REP STOSWএটি জেআইটি (যেমন লুপটি সিপিইউর অভ্যন্তরে থাকে) এর মতো কিছুতে অনুকূলিত না হয় ।

int[] src = new int[] {1, 2, 3, 4, 5};
int[] dst = new int[3];

System.arraycopy(src, 1, dst, 0, 3); // Copies 2, 3, 4 into dst

7

এ্যাপাচি ব্যবহার ArrayUtils এ ডাউনলোডযোগ্য এই লিঙ্কে আপনি সহজ পদ্ধতি ব্যবহার করতে পারেন

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 

"বুলিয়ান" কেবল একটি উদাহরণ, সমস্ত আদিম জাভা ধরণের জন্য পদ্ধতি রয়েছে


6

জেডিকে> = 1.8

আমি উপরের সমস্ত উত্তর সাথে একমত। জাভা 8 স্ট্রিমগুলির সাথে একটি দুর্দান্ত উপায়ও রয়েছে:

int[] subArr = IntStream.range(startInclusive, endExclusive)
                        .map(i -> src[i])
                        .toArray();

এটির সুবিধাটি হ'ল এটি বিভিন্ন ধরণের "src" অ্যারের জন্য কার্যকর হতে পারে এবং স্ট্রিমে পাইপলাইন অপারেশন লেখার উন্নতি করতে সহায়তা করে।

এই প্রশ্নটি সম্পর্কে বিশেষ নয়, তবে উদাহরণস্বরূপ, যদি উত্স অ্যারেটি ছিল double[]এবং আমরা average()সাব-অ্যারেটি নিতে চাই :

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();


2

কোডটি সঠিক তাই আমি অনুমান করছি যে আপনি কোনও পুরানো জেডিকে ব্যবহার করছেন। এই পদ্ধতির জাভাদোক বলেছেন যে এটি ১.6 থেকে রয়েছে। কমান্ড লাইন টাইপ করুন:

java -version

আমি অনুমান করছি যে আপনি 1.6 চালাচ্ছেন না


1

আমি তার System.arraycopy()পরিবর্তে সংস্করণ 1.6 ব্যবহারের আগে জাভা ব্যবহার করছি । বা আপনার পরিবেশ আপগ্রেড করুন।

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