2010-01-07 12 views
18

मेरे पास फ्लोट की एक सरणी है और मैं इसे जावा में युगल की एक सरणी में परिवर्तित करना चाहता हूं। मैं सरणी पर पुनरावृत्त करने और एक नया निर्माण करने के स्पष्ट तरीके से अवगत हूं। मुझे उम्मीद है कि जावा एक फ्लोट को पचाने के लिए [] आसानी से जहां यह डबल [] के साथ काम करना चाहता है ... लेकिन यह इसके साथ काम नहीं कर सकता है। इस रूपांतरण को करने का सुरुचिपूर्ण, प्रभावी तरीका क्या है?जावा में युगल के युगल में फ्लोट की सरणी को कैसे परिवर्तित करें?

+1

ऐसा करने का कोई तरीका नहीं है क्योंकि "सुंदरता" ऐसा करने का कोई तरीका नहीं है क्योंकि फ्लोट और डबल आकार और बिट पैटर्न द्वारा पूरी तरह से अलग डेटाटाइप हैं। तो स्पष्ट तरीका केवल एक ही है। –

उत्तर

30

मूल रूप से कुछ प्रत्येक मान का रूपांतरण करना है। दो सरणी प्रकारों के बीच एक अंतर्निहित रूपांतरण नहीं है क्योंकि जेआईटीटिंग के बाद उन्हें संभालने के लिए इस्तेमाल किया जाने वाला कोड अलग-अलग होगा - उनके पास एक अलग तत्व आकार होगा, और फ्लोट को रूपांतरण की आवश्यकता होगी जबकि डबल नहीं होगा। संदर्भ प्रकारों के लिए सरणी covariance की तुलना करें, जहां डेटा पढ़ने के दौरान कोई रूपांतरण आवश्यक नहीं है (उदाहरण के लिए, बिट पैटर्न एक ऑब्जेक्ट संदर्भ के रूप में स्ट्रिंग संदर्भ के लिए समान है) और तत्व का आकार सभी संदर्भ प्रकारों के लिए समान है।

संक्षेप में, कुछ को लूप में रूपांतरण करना होगा। मुझे ऐसा करने के लिए किसी भी अंतर्निहित तरीकों के बारे में पता नहीं है। मुझे यकीन है कि वे कहीं तीसरे पक्ष के पुस्तकालयों में मौजूद हैं, लेकिन जब तक कि आप पहले से ही उन पुस्तकालयों में से किसी एक का उपयोग नहीं करते हैं, तो मैं बस अपनी खुद की विधि लिखूंगा। सुविधा के लिए, यहां नमूना कार्यान्वयन है:

public static double[] convertFloatsToDoubles(float[] input) 
{ 
    if (input == null) 
    { 
     return null; // Or throw an exception - your choice 
    } 
    double[] output = new double[input.length]; 
    for (int i = 0; i < input.length; i++) 
    { 
     output[i] = input[i]; 
    } 
    return output; 
} 
+0

आप इसे एक विस्तार विधि भी बना सकते हैं। – Seth

+3

@ सेठ: यह जावा है, सी # नहीं। –

+0

आप इसे 'कन्वर्ट टोडबल्स' या 'टूडबल्स' नाम दे सकते हैं और अन्य आदिम (और बॉक्स किए गए) प्रकारों के लिए ओवरलोड प्रदान कर सकते हैं। –

1

क्या आपको वास्तव में अपनी फ्लोट सरणी को डबल सरणी में कॉपी करने की आवश्यकता है? जब तैरता आप इस का उपयोग कर सकते हैं ... का उपयोग कर आप संकलक और प्रकार के साथ परेशानी हो रही है

float x = 0; 
double d = Double.valueOf(x); 

क्या लाभ आप एक प्रति लेने के द्वारा प्राप्त होता है? यदि आपको फ्लोट्स के आधार पर गणना के परिणामों में अधिक सटीकता की आवश्यकता है तो परिणाम double बनाएं। मैं सरणी की प्रतिलिपि बनाने के लिए बहुत सारे डाउनसाइड्स देख सकता हूं, और कॉपी फ़ंक्शन कर रहा हूं, खासकर यदि यह बड़ा है। सुनिश्चित करें कि आपको वास्तव में ऐसा करने की ज़रूरत है।

HTH

+1

मुझे एक बहुत ही स्पष्ट कारण दिखाई देता है: एक विधि को कॉल करना जिसके लिए 'फ्लोट []' में आपका डेटा होने पर 'डबल []' की आवश्यकता होती है। –

+0

जाहिर है, लेकिन ओपी इसका उल्लेख नहीं करता है। मैं सिर्फ एक विकल्प देना चाहता था क्योंकि उसने इसके लिए पूछा था। – Simon

+0

एंड्रियास_D ने समझाया। मुझे एक दूसरे के साथ खेलने के लिए दो पुस्तकालय बनाने की जरूरत थी। तब में से एक डबल [] वैक्टर के साथ काम करता है, दूसरा फ्लोट [] (गणितीय अर्थ में वेक्टर) के साथ। कास्टिंग सरणी के साथ जावा समस्याएं, इन पुस्तकालयों से मेल खाने से यह इतना आसान नहीं है। ऐसा लगता है कि सरणी पर लूप की आवश्यकता के बिना कोई समाधान मौजूद नहीं है। उत्तर के लिए धन्यवाद। – fifigyuri

7

जावा 8 में आप, अगर तुम सच में करना चाहते हैं कर सकते हैं, करते हैं:

IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray(); 

लेकिन यह (क्लीनर, तेज, बेहतर अर्थ विज्ञान) जॉन स्कीट के समारोह का उपयोग करना बेहतर है।

+0

मैं यह नहीं खरीदता कि जॉन स्कीट बेहतर है। असल में, यह एक समानांतर में अनुकूलित और किया जा सकता है।यह स्पष्ट हो रहा है कि क्या हो रहा है और इसे कार्यात्मक समकक्ष (डबल []) फ्लोटएरे में बदल दिया जा सकता है। धाराओं का उपयोग करने का कारण यह है कि यह संकलक को बताता है कि हमें परवाह नहीं है कि यह कैसे किया जाता है या किस क्रम में, इन सभी मूल्यों को इन अन्य लोगों को मानचित्र करें। बाहरी रूप से उनके माध्यम से लूप की बजाय। – Tatarize

संबंधित मुद्दे