java - मैं डबल[] को डबल[] में कैसे बदलूं?




arrays autoboxing (6)

आप कनवर्ट करने के लिए ArrayUtils का उपयोग कर सकते हैं

Double[] d; // initialise
double[] array = ArrayUtils.toPrimitive(d);

संपूर्ण डेटा को लूप करने की कोई आवश्यकता नहीं है।

मैं एक ऐसे इंटरफ़ेस को लागू कर रहा हूं जिसमें एक टेबल के समान कार्यक्षमता है जिसमें एक प्रकार की वस्तुएं हो सकती हैं। इंटरफ़ेस निम्नलिखित फ़ंक्शन को निर्दिष्ट करता है:

double[] getDoubles(int columnIndex);

जहां मैं स्तब्ध हूं कि मेरे कार्यान्वयन में, मैं तालिका डेटा को 2 डी Object ऐरे ( Object[][] data ) में संग्रहीत कर रहा हूं। जब मुझे मूल्यों को वापस करने की आवश्यकता होती है, तो मैं निम्नलिखित करना चाहता हूं (यह माना जाता है कि getDoubles() केवल एक स्तंभ पर बुलाया जाएगा जिसमें डबल्स होते हैं, इसलिए कोई ClassCastExceptions नहीं होगी):

double[] getDoubles(int columnIndex) {
    return (double[]) data[columnIndex];
}

लेकिन - Java Object[] को double[] करने के लिए कास्ट करने की अनुमति नहीं देता है double[] । इसे Double[] ठीक है क्योंकि Double एक वस्तु है और एक आदिम नहीं है, लेकिन मेरा इंटरफ़ेस निर्दिष्ट करता है कि डेटा एक double[] रूप में वापस आ जाएगा।

इसलिए मेरे दो सवाल हैं:

  1. क्या कोई ऐसा तरीका है जिससे मैं कॉलम डेटा को Object[][] टेबल से बाहर निकाल सकता हूं और आदिमों की सरणी वापस कर सकता हूं?
  2. यदि मैं Double[] को वापस लाने के लिए इंटरफ़ेस को बदलता हूं, तो क्या कोई प्रदर्शन प्रभाव होगा?

आप प्रत्येक लूप के लिए एक ही आकार के एक अस्थायी सरणी के निर्माण के लिए उपयोग कर सकते हैं, फिर प्रत्येक व्यक्तिगत तत्व को दोगुना करने के लिए डाल सकते हैं, लेकिन यह सरणी में है।

इसलिए:

double[] tempArray = new double[data[columnIndex].length];
int i = 0;
for(Double d : (Double) data[columnIndex]) {
  tempArray[i] = (double) d;
  i++;
}

कृपया मुझे सुधारो अगर मैं यहाँ गलत हूँ।


दुर्भाग्यवश आपको पूरी सूची के माध्यम से लूप की आवश्यकता होगी और यदि आप इसे double[] बदलना चाहते हैं तो Double अनबॉक्स करें।

जहां तक ​​प्रदर्शन जाता है, जावा में मुक्केबाजी और अनबॉक्सिंग प्राइमेटिव से जुड़े कुछ समय है। यदि सेट काफी छोटा है, तो आपको कोई प्रदर्शन समस्याएँ नहीं दिखेंगी।


मेरे पास jjnguy और एरिक कोसलो द्वारा कही गई वास्तविक प्रश्न से जोड़ने के लिए कुछ भी नहीं है।

लेकिन सिर्फ एक पक्ष ध्यान दें: आप एक ऑब्जेक्ट सरणी को डबल सरणी में कास्टिंग करने का उल्लेख करते हैं। निम्नलिखित काम नहीं करेगा:

Object[] oa=new Object[3];
oa[0]=new Double("1.0");
oa[1]=new Double("2.0");
oa[2]=new Double("3.0");
Double[] da=(Double[])oa;

अंतिम पंक्ति एक क्लास कास्ट अपवाद को फेंक देगी। भले ही सरणी में प्रत्येक तत्व वास्तव में एक डबल है, सरणी को ऑब्जेक्ट्स के एक सरणी के रूप में बनाया गया था, डबल्स की एक सरणी नहीं, इसलिए कलाकार अमान्य है।


यदि आप एक double[] वापस करना चाहते हैं, तो आपको एक new double[] बनाना होगा, उसे पॉप्युलेट करना होगा, और उसे वापस करना होगा।

यह एक अच्छा वास्तुकला निर्णय हो सकता है। सबसे पहले, यह एक Object[] एक Double[] करने के लिए बहुत मायने नहीं रखता है; यह वास्तव में Double की एक सरणी नहीं है क्योंकि इसमें Object भी हो सकते हैं। दूसरा, यदि आप सरणी को सीधे लौटाते हैं, तो उपयोगकर्ता कोड इसे संशोधित कर सकता है और आपकी वस्तु की आंतरिक संरचना को बदल सकता है।

बॉक्सिंग और आवंटन की लागत के कारण मुख्य प्रदर्शन प्रभाव double[] की एक सरणी को लौटाने में होगा।


यदि आप एक तृतीय पक्ष पुस्तकालय का उपयोग करने से बुरा नहीं मानते हैं, तो कॉमन्स-लैंग में हेरफेर के लिए विभिन्न तरीकों के साथ ArrayUtils प्रकार है।

Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);

पूरक विधि भी है

doubles = ArrayUtils.toObject(d);

संपादित करें: शेष प्रश्न का उत्तर देने के लिए। ऐसा करने के लिए कुछ ओवरहेड होगा, लेकिन जब तक कि यह सरणी वास्तव में बड़ी नहीं हो जाती तब तक आपको इसके बारे में चिंता नहीं करनी चाहिए। यह देखने के लिए पहले परीक्षण करें कि क्या यह रिफैक्टरिंग से पहले एक समस्या है।

जिस विधि के बारे में आपने वास्तव में पूछा था उसे लागू करने से कुछ ऐसा होगा।

double[] getDoubles(int columnIndex) {
    return ArrayUtils.toPrimitive(data[columnIndex]);
}





autoboxing