जावा में एक ऐरे का ही हिस्सा लें?


275

मेरे पास जावा में इंटेगर की एक सरणी है, मैं इसका केवल एक हिस्सा उपयोग करना चाहूंगा। मुझे पता है कि पायथन में आप इस एरे [इंडेक्स:] की तरह कुछ कर सकते हैं और यह इंडेक्स से एरे लौटाता है। क्या जावा में ऐसा कुछ संभव है।

जवाबों:


444

जावा में एक सरणी की लंबाई अपरिवर्तनीय है। तो, आपको एक नए सरणी के रूप में वांछित भाग की प्रतिलिपि बनाने की आवश्यकता है। Java.util.Arrays वर्ग से विधि का
उपयोग करें :copyOfRange

int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);

startIndex , कॉपी की जाने वाली समावेशी श्रेणी का प्रारंभिक सूचकांक है।
EndIndex , कॉपी की जाने वाली विशेष की सीमा का अंतिम सूचकांक है। (यह सूचकांक सरणी के बाहर झूठ हो सकता है)

उदाहरण के लिए:

   //index   0   1   2   3   4
int[] arr = {10, 20, 30, 40, 50};
Arrays.copyOfRange(arr, 0, 2);          // returns {10, 20}
Arrays.copyOfRange(arr, 1, 4);          // returns {20, 30, 40}
Arrays.copyOfRange(arr, 2, arr.length); // returns {30, 40, 50} (length = 5)

वहाँ एक आकार सीमा लगती है? केवल यह काम करता है: Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)255 के बजाय मैं Integer.MAX_VALUE का उपयोग नहीं कर सकता, अगर मैं वास्तविक लंबाई प्राप्त नहीं करना चाहता हूं
कुंभ पावर

@AquariusPower आकार की सीमा सरणी आकार है, और यह 255 से बड़ा हो सकता है। आप सिर्फ endIndexपहले तर्क के रूप में पारित सरणी के आकार से बड़ा प्रदान नहीं कर सकते । इसलिए, यदि आप एक पूर्ण प्रति चाहते हैं, तो इस सरणी का संदर्भ देते हुए एक वैरिएबल बनाएं और Arrays.copyOfRange(var, 0, var.length)Arrays.copyOf(var, var.length)
उपनाम

मुझे स्टैकट्रेस उप-सरणी के लिए एक स्थानीय संस्करण बनाना होगा, लेकिन मैंने पाया कि यह काम करता है !!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
कुंभ राशि

के बारे में सावधान रहें ArrayIndexOutOfBoundsException
इलायस

1
एक और समस्या है। क्या होगा अगर मुझे लंबाई के स्ट्रिंग सरणी को विभाजित करने की आवश्यकता है 500K को 250K के उप-भागों में कहें। ये विधि 65000 पर जो अधिकतम बाहर interegr स्वीकार करता है।
विष्णु Dahatonde

31

आप अपने सरणी को एक सूची के रूप में लपेट सकते हैं, और इसके अधीन सूची का अनुरोध कर सकते हैं।

MyClass[] array = ...;
List<MyClass> subArray = Arrays.asList(array).subList(index, array.length);

22

हां, आप Arrays.copyOfRange का उपयोग कर सकते हैं

यह एक ही चीज़ के बारे में करता है (ध्यान दें कि एक प्रति है: आप प्रारंभिक सरणी नहीं बदलते हैं)।


2
यदि आप एक स्पष्ट प्रति नहीं बनाना चाहते हैं, तो उन्होंने कहा, आपको @ K-ballo के उत्तर में उल्लिखित एक Listऔर एक का उपयोग करना होगा subList
लुई वासरमैन

ये सही है। जावा में सरणी स्लाइसिंग सुविधाएं नहीं हैं जो अधिक आधुनिक भाषाओं की पेशकश करती हैं।
डेनिस सेगुरेट

मुझे यकीन नहीं है कि मैं इसे इस तरह रखूँगा, लेकिन ... हाँ, जावा सरणी टुकड़ा करने की पेशकश नहीं करता है। (उस ने कहा, इस दृष्टिकोण के कुछ फायदे हैं: मेमोरी लीक की संभावना कम हो गई, अतिरिक्त क्षेत्रों से बचकर सरणी ओवरहेड को कम कर दिया, आदि। आप किसी भी तरह से जा सकते हैं।)
लुई वासरमैन

हां, आप फिर से सही हैं (और मैंने लौ युद्ध शुरू करने की कोशिश नहीं की;))। Slicing GC को बहुत जटिल बनाता है। और जब जावा ने स्ट्रिंग्स में ऑब्जेक्ट आधारित अंतर्निहित स्लाइसिंग की कोशिश की, तो यह अधिक स्पष्ट था कि यह खतरनाक था
डेनसिटी सेरगुट

11

तुम कोशिश कर सकते हो:

System.arraycopy(sourceArray, 0, targetArray, 0, targetArray.length);// copies whole array

// copies elements 1 and 2 from sourceArray to targetArray
System.arraycopy(sourceArray, 1, targetArray, 0, 2); 

सिस्टम के लिए javadoc देखें ।


3
मुझे बस इतना पसंद है कि यह वास्तव में कैसा है Arrays.copyOf () और Arrays.copyOfRange () वास्तव में लागू होते हैं (sans सीमा जाँच) और फिर भी यह कोई वोट नहीं मिलता है जबकि System.arraycopy डेटिंग के बावजूद वोटों को थोड़ा ऊपर उठाते हैं। 1995 को वापस।
डेव

1
मुझे लगता है कि यह "आधुनिक" कुछ के लिए पर्याप्त नहीं दिखता है।
डेव

मुझे पुराने स्कूल में जाना पसंद है, कोई चमकदार घंटियाँ और सीटी बस आवश्यक मशीनरी नहीं। जैसे
मेम्पी

लेकिन arrays.copyOfRange () का उपयोग करने से पठनीयता बढ़ती है और बग की संभावना काफी कम हो जाती है।
फ्लोरियन एफ

7

यदि आप जावा 1.6 या अधिक का उपयोग कर रहे हैं, तो आप Arrays.copyOfRangeसरणी के एक हिस्से को कॉपी करने के लिए उपयोग कर सकते हैं । जावदोक से:

निर्दिष्ट सरणी की निर्दिष्ट सीमा को नए सरणी में कॉपी करता है। रेंज का प्रारंभिक सूचकांक (से) शून्य और original.length, समावेशी के बीच होना चाहिए । मान original[from]को प्रतिलिपि के प्रारंभिक तत्व (जब तक from == original.lengthया नहीं from == to) में रखा गया है । मूल सरणी में बाद के तत्वों से मान कॉपी में बाद के तत्वों में रखा जाता है। रेंज का अंतिम इंडेक्स ( to), जो कि इससे अधिक या उसके बराबर होना चाहिए from, से अधिक हो सकता है original.length, इस मामले falseमें कॉपी के सभी तत्वों में रखा गया है, जिसका इंडेक्स उससे अधिक या उसके बराबर है original.length - from। लौटे सरणी की लंबाई होगी to - from

यहाँ एक सरल उदाहरण है :

/**
 * @Program that Copies the specified range of the specified array into a new 
 * array.
 * CopyofRange8Array.java 
 * Author:-RoseIndia Team
 * Date:-15-May-2008
 */
import java.util.*;
public class CopyofRange8Array {
    public static void main(String[] args) {
       //creating a short array
       Object T[]={"Rose","India","Net","Limited","Rohini"};
        // //Copies the specified  short array upto specified range,
        Object T1[] = Arrays.copyOfRange(T, 1,5);
        for (int i = 0; i < T1.length; i++) 
            //Displaying the Copied short array upto specified range
            System.out.println(T1[i]);
    }

}



-2

आप subList(int fromIndex, int toIndex)अपने पूर्णांकों को गिरफ्तार करने की विधि का उपयोग कर सकते हैं , कुछ इस तरह से:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> arr = new ArrayList<>();
        arr.add(1);
        arr.add(2);
        arr.add(3);
        arr.add(4);
        List<Integer> partialArr = arr.subList(1, 3);

        // print the subArr
        for (Integer i: partialArr)
            System.out.println(i + " ");
    }
}

आउटपुट हो जाएगा: 2 3

ध्यान दें कि subList(int fromIndex, int toIndex)विधि 2 चर पर शून्य से 1 प्राप्त करती है (var2 - 1), मुझे ठीक से पता नहीं क्यों, लेकिन ऐसा होता है, शायद सरणी के आकार को पार करने की संभावना को कम करने के लिए।

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