जावा में अन्य सरणी से उप सरणी कैसे बनाएं?


284

दूसरे एरे से सब-अरेंज कैसे बनाएं? क्या ऐसी विधि है जो पहले सरणी से अनुक्रमित लेती है जैसे:

methodName(object array, int start, int end)

मैं छोरों को बनाने और अपने कार्यक्रम को भुगतना नहीं चाहता।

मुझे त्रुटि मिलती रहती है:

प्रतीक विधि नहीं पा सकते हैं copyOfRange (int [], int, int)

यह मेरा कोड है:

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

आप उपयोग कर सकते हैं

JDK> 1.5

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

जावाडोक

JDK <= 1.5

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

जावाडोक


3
मैं अपने Arrays.copyOfRange में ऑब्जेक्ट [] के नहीं होने के साथ कुछ मुद्दे रख रहा था। Java.util.Arrays का उपयोग करने के लिए अपने आयात की जाँच करें। किसी तरह एक अलग Arrays संस्करण आयात हो गया और मैंने JRE और JDKs की जाँच के लिए 15 मिनट बर्बाद कर दिए।
न्यूक्लियरपॉन

@ न्यूक्लियरपोन धन्यवाद !!! इससे पहले कि मैं अपने आप को यह पता लगाता मुझे एक लंबा समय लगेगा। ग्रहण स्वचालित रूप से आयात किया गया org.bouncycastle.util.Arrays
औरदेरो

136

Arrays.copyOfRange(..)जावा 1.6 में जोड़ा गया था। तो शायद आपके पास नवीनतम संस्करण नहीं है। यदि इसे अपग्रेड करना संभव नहीं है, तो देखेंSystem.arraycopy(..)


1
@Sami या तो 1.6 पर अपग्रेड करें या संदर्भ डाऊनलोड के लिए इस डॉक को देखें download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
जिगर जोशी

4
आपका JDK किस वेंडर से है। सन / ओरेकल ने 4.00.28 संस्करण कभी जारी नहीं किया और Google इसे ढूंढ भी नहीं पाया।
पीटर लॉरी

copyOfRange तत्वों को पीछे छोड़ता है, यदि वे एक छोटे सरणी को आवंटित करने के बजाय स्रोत सरणी श्रेणी से बाहर हैं :(
Daneel S. Yaitskov

12
किसी को जवाब में जोड़ना चाहिए कि "स्टार्ट-इंडेक्स" समावेशी है, "एंड-इंडेक्स" अनन्य है
यान किंग यिन

@YanKingYin आप सही हैं - यह ठीक वही है जो मैं टिप्पणियों के लिए पढ़ रहा था :)
बेन कुशीयन


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

इस लिंक पर Apache ArrayUtils डाउनलोड करने योग्य का उपयोग करके आप आसानी से विधि का उपयोग कर सकते हैं

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

"बूलियन" केवल एक उदाहरण है, सभी प्राइमेटिव जावा प्रकार के लिए विधियां हैं


6

JDK> = 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

कोड सही है इसलिए मैं अनुमान लगा रहा हूं कि आप एक पुराने JDK का उपयोग कर रहे हैं। उस पद्धति के लिए javadoc का कहना है कि यह 1.6 के बाद से वहाँ है। कमांड लाइन प्रकार पर:

java -version

मैं अनुमान लगा रहा हूं कि आप 1.6 नहीं चला रहे हैं


1

मैं संस्करण के System.arraycopy()बजाय 1.6 संस्करण से पहले जावा का उपयोग कर रहा हूं । या अपने पर्यावरण को अपग्रेड करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.