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




arrays autoboxing (8)

जावा 8 में, यह एक-लाइनर है:

Double[] boxed = new Double[] { 1.0, 2.0, 3.0 };
double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();

ध्यान दें कि यह अभी भी मूल सरणी पर पुनरावृत्त करता है और एक नया बनाता है।

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

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[] को वापस लाने के लिए इंटरफ़ेस को बदलता हूं, तो क्या कोई प्रदर्शन प्रभाव होगा?

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

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

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


मेरे पास 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[] tempArray = new double[data[columnIndex].length];
int i = 0;
for(Double d : (Double) data[columnIndex]) {
  tempArray[i] = (double) d;
  i++;
}

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


मैं ArrayUtils का दूसरा जवाब दूंगा और यह जोड़ूंगा कि 1.5 ऑटोबॉक्सिंग प्रलेखन (के via ) थोड़े से पता चलता है कि कोई बिल्टिन रास्ता नहीं है:

सरणी प्रकार SC [] से सरणी प्रकार TC [] में कोई अनुमत रूपांतरण नहीं है, अगर SC से TC में स्ट्रिंग रूपांतरण के अलावा कोई अन्य रूपांतरण की अनुमति नहीं है।


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

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

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


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

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


कोटलिन उपयोगकर्ता बस करते हैं:

println(InputStreamReader(is).readText())

जहाँ तक

readText()

कोटलिन मानक पुस्तकालय की अंतर्निहित विस्तार विधि है।





java arrays autoboxing