वस्तुओं की एक सरणी को उनके आदिम प्रकारों की एक सरणी में बदलना


80

यदि आपके पास जावा ऑब्जेक्ट्स की एक सरणी है जिसमें एक आदिम प्रकार है (उदाहरण के लिए बाइट, इंटेगर, चार, आदि)। क्या कोई साफ तरीका है कि मैं इसे आदिम प्रकार की एक सरणी में बदल सकता हूं? विशेष रूप से यह सामग्री के माध्यम से एक नया सरणी और लूप बनाने के बिना किया जा सकता है।

इसलिए, उदाहरण के लिए, दिया गया

Integer[] array

इसे बदलने का सबसे साफ तरीका क्या है

int[] intArray

दुर्भाग्य से, यह कुछ ऐसा है जो हमें हाइबरनेट और कुछ तीसरे पक्ष के पुस्तकालयों के बीच अंतर करते समय करना पड़ता है, जिस पर हमारा कोई नियंत्रण नहीं है। ऐसा लगता है कि यह एक बहुत ही सामान्य ऑपरेशन होगा, इसलिए अगर कोई शॉर्टकट नहीं है तो मुझे आश्चर्य होगा।

आपकी सहायताके लिए धन्यवाद!

जवाबों:


40

दुर्भाग्य से, जावा प्लेटफॉर्म में ऐसा कुछ भी नहीं है जो ऐसा करता है। Btw, आपको सरणी nullमें तत्वों को स्पष्ट रूप से संभालने की Integer[]आवश्यकता है ( intआप उन लोगों के लिए क्या उपयोग करने जा रहे हैं?)।


6
नलियों के बारे में अच्छी बात है। मेरे उद्देश्यों के लिए मैंने एक अपवाद को स्वीकार किया होगा यदि प्रविष्टियों में से एक शून्य है, तो उसी तरह जब आप किसी ऑब्जेक्ट को अनबॉक्स करते हैं तो NullPointerException को फेंक दिया जाता है।
इल-भीम

2
यह उत्तर जावा 8 के साथ सटीक नहीं है, एलेक्स का जवाब देखें
रॉन्ग


70

जावा 8 में शुरू की गई धाराओं के साथ यह किया जा सकता है:

int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();

हालांकि, फ़िलहाल के लिए केवल आदिम धाराएं हैं int, longऔर double। यदि आपको एक और आदिम प्रकार में परिवर्तित करने की आवश्यकता है जैसे कि byteबाहरी पुस्तकालय के बिना सबसे छोटा रास्ता यह है:

byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];

या यदि आप चाहें तो लूप को एक स्ट्रीम से बदला जा सकता है:

IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);

ये सभी NullPointerExceptionआपके किसी भी तत्व के होने पर फेंक देंगे null


2
इसके बजाय Integer::intValue, आप भी उपयोग कर सकते हैं i -> i(जो अनबॉक्सिंग का उपयोग करता है)।
रॉन्ग

1
@robinst और अनबॉक्सिंग Integer::intValueआपके लिए कंपाइलर कॉलिंग है, इसलिए जब विधि आसानी से उपलब्ध हो, तो नया लैम्ब्डा क्यों बनाएं?
एंड्रियास

@ और सिर्फ एक और विकल्प सूचीबद्ध करना, जिसे आप चुनते हैं वह कोड शैली / व्यक्तिगत पसंद का सवाल है। मैंने दो दृष्टिकोणों को माइक्रोबेंचमार्क (जेएमएच का उपयोग करके) भी किया है, और उनका प्रदर्शन समान है।
रॉबिन

पोस्ट किए गए पहले कोड स्निपेट का उपयोग करना मुझे "स्थिर संदर्भ में गैर-स्थिर पद्धति का उपयोग नहीं कर सकता" त्रुटि दे रहा था इसलिए मैंने किया: int[] ints = Arrays.stream(objects).mapToInt(i -> Integer.parseInt(i.toString())).toArray(); आशा है कि यह उसी मुद्दे के साथ किसी के लिए भी उपयोगी है। और अगर कोई बेहतर तरीका जानता है तो कृपया मुझे बताएं।
कार्तिक चुघ

यह आजकल स्वीकृत उत्तर होना चाहिए। धन्यवाद एलेक्स।
प्रति लंडबर्ग


3

विशेष रूप से यह सामग्री के माध्यम से एक नया सरणी और लूप बनाने के बिना किया जा सकता है।

आप पूर्णांक के एक सरणी को int में नहीं बदल सकते (यानी आप किसी सरणी के तत्वों के प्रकार को बदल नहीं सकते हैं)। इसलिए आपको या तो एक नया int बनाना होगा [] सरणी और इसमें पूर्णांक वस्तुओं के मूल्य को कॉपी करें या आप एक एडाप्टर का उपयोग कर सकते हैं:

class IntAdapter {
    private Integer[] array;
    public IntAdapter (Integer[] array) { this.array = array; }
    public int get (int index) { return array[index].intValue(); }
}

यह आपके कोड को थोड़ा अधिक पठनीय बना सकता है और IntAdapter ऑब्जेक्ट केवल कुछ बाइट्स मेमोरी का उपभोग करेगा। एक एडॉप्टर का बड़ा फायदा यह है कि आप यहां विशेष मामलों को संभाल सकते हैं:

class IntAdapter {
    private Integer[] array;
    public int nullValue = 0;
    public IntAdapter (Integer[] array) { this.array = array; }
    public int get (int index) { 
        return array[index] == null ? nullValue : array[index].intValue();
    }
}

एक अन्य उपाय कॉमन्स प्राइमिटिव का उपयोग करना है जिसमें बहुत सारे पूर्वनिर्धारित एडेप्टर हैं। आपके मामले में, ListIntList पर एक नज़र है ।


2

या बस इसे आसान तरीका है अगर आप इसे केवल एक बार करते हैं। लेकिन आपने Integer! = Null के बारे में बात नहीं की है।

    //array is the Integer array
    int[] array2 = new int[array.length];
    int i=0;
    for (Integer integer : array) {
        array2[i] = integer.intValue();
        i++;
    }

1

डॉलर का उपयोग सरल है:

Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();

6
यह जावा प्रतीत नहीं होता है, कम से कम जावा 1.6 या 1.7 नहीं है।
लॉर्डआर्कल

2
@ लॉरडॉल डॉलर वास्तव में जावा पुस्तकालय है
जारोस्लाव ज़ारूबा

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