2012-03-14 10 views
5

मैं है एक तरीका है जिसके केवल हो जाता है double[][] जो मैं int[][] पारित करने के लिए चाहते हैं, वहाँ जावा में, के रूप में सरल कुछ ऐसा करने का एक छोटा रास्ता है:सबसे छोटा में एक 2d पूर्णांक सरणी कास्ट करने के लिए जिस तरह से 2 डी डबल

int [][] iArray = { 
      { 1, 2, }, 
      { 5, 6, } 
     }; 
double [][] dArray = (double[][]) iArray ; ??? 

उत्तर

18

दुर्भाग्य से केवल अपने सरणी कास्ट करने के लिए जिस तरह से प्रत्येक तत्व के माध्यम से पुनरावृति और एक एक करके उन्हें एक डाली अपने नए double[][] सरणी में जबकि पुन: डालने के लिए है।

कोई शॉर्टकट नहीं है।

+1

क्या आपको यकीन है ... ??? – Lion

+4

हाँ। मेरे स्रोत इस विषय पर मेरा स्वयं का शोध हैं। ;) चारों ओर गुगल करने से आपको एक ही निष्कर्ष मिल जाएगा। – Vache

+0

+1। यही एकमात्र रास्ता है। डील। –

0

आप उन्हें डाली नहीं कर सकते, युगल ints से स्मृति में अलग से बाहर रखा जाता है, यह सिर्फ अपने नाम बदलने का एक मामला नहीं है।

संपादित करें: केवल अगर डबल एक सुपर या उप-वर्ग वर्ग int था तो संभव हो सकता है।

+0

यह एक बहुत ही उपयोगी उत्तर नहीं है। यहां तक ​​कि यदि उन्हें वही रखा गया था (यानी 32 बिट्स दोनों), तो भी आप उन्हें नहीं डाल सके। जावा टाइप सिस्टम बस इसे अनुमति नहीं देता है। – Jochen

+0

मुझे लगता है कि मैं जो हासिल करने की कोशिश कर रहा हूं वह यह है कि कोई दूसरे के उप-वर्ग नहीं है, इसलिए कास्टिंग समझ में नहीं आता है। तथ्य यह है कि वे 32 बिट्स का मतलब यह नहीं है कि वे इसे बाहर रखे गए हैं। लेकिन मैं आपकी बात देखता हूँ। – Sandro

2

नहीं, यह सही टाइपिंग नहीं है। int [] एक प्रकार और डबल है [] एक प्रकार है और उनके पास कोई संबंध नहीं है, इसलिए ऐसे असाइनमेंट की अनुमति नहीं है। इसलिए, इसे कास्ट करने का कोई तरीका नहीं है।

आप तत्वों की नकल करना होगा (आप कास्टिंग के बिना एक डबल करने के लिए एक पूर्णांक असाइन कर सकते हैं)।

0

आप इस तरह यह कर सकते हैं:

int[][] intarray = {{1, 2}, {5, 6}}; 

    double[][] doublearray = new double[intarray.length][intarray[0].length]; 

    for(int i = 0; i < intarray.length; i++) 
    { 
     for(int j = 0; j < intarray[0].length; j++) 
      doublearray[i][j] = (double) intarray[i][j]; 
    } 

संपादित करें: के रूप में Andreas_D कहे अनुसार, इस तभी काम करता है सभी पंक्तियों में एक ही लंबाई के हैं, अगर आप चर लंबाई चाहते हैं, आप को पार करना होगा कॉलम की एक परिवर्तनीय मात्रा के लिए लूप के लिए दूसरा।

+4

यह केवल तभी काम करता है जब सभी पंक्तियों की लंबाई समान हो। –

+0

आपको वास्तव में कास्टिंग करने की ज़रूरत नहीं है, इसलिए आप "(डबल)" को छोड़ सकते हैं। @ एंड्रियास; हाँ। – Martin

0

हम्म, मेरा कोड जावा 8 में लिखा गया है जिसे शॉर्टकट कहा जाता है?

import java.util.Arrays; 

// ... 

/// Cast! 
int[][] int2DArray = {{3, 1}, {3, 3, 7}, {}}; 
Object[] arrayOfUntypedArraies = Arrays.stream(int2DArray).map(intArray -> Arrays.stream(intArray).asDoubleStream().toArray()).toArray(); 
double[][] double2DArray = Arrays.copyOf(arrayOfUntypedArraies, arrayOfUntypedArraies.length, double[][].class); 

/// Print! 
System.out.println(Arrays.deepToString(int2DArray)); 
// [[1, 2], [5, 6, 7], []] 
System.out.println(Arrays.deepToString(double2DArray)); 
// [[1.0, 2.0], [5.0, 6.0, 7.0], []] 
0

जावा 8 में आप double रों की एक सरणी में int रों के एक 1-आयामी सरणी डाली कर सकते हैं:

double[] singleDimensionDoubleArray = 
     Arrays.stream(singleDimensionIntArray).asDoubleStream().toArray() 

इसलिए मैं लिखा था कि मैं क्या ग्रहण से अधिक पाशन द्वारा एक तेजी से संस्करण होगा पंक्तियों:

int[][] iArray = { 
    {1, 2,}, 
    {5, 6,} 
}; 

double[][] dArray = new double[iArray.length][]; 
for (int row = 0; row < iArray.length; row++) { 
    dArray[row] = Arrays.stream(iArray[row]).asDoubleStream().toArray(); 
} 

मैं बस के बारे में इस उत्तर पोस्ट करने के लिए था, लेकिन मैं कितना यह तेजी से किया गया था कि भोलेपन से अधिक हर तत्व पाशन के बारे में कुछ मीट्रिक पोस्ट था सोचा। यह पता चला है कि यह चारों ओर 10x धीमी था! मैंने इसे शून्य के 10000x1000 सरणी के साथ परीक्षण किया। मुझे लगता है कि यह अतिरिक्त वस्तु निर्माण है जो मंदी का कारण बनता है।

जब तक किसी और अन्यथा साबित कर सकते हैं, मुझे लगता है कि सबसे सरल समाधान वास्तव में सबसे तेज है:

for (int row = 0; row < iArray.length; row++) { 
    for (int column = 0; column < iArray[0].length; column++) { 
     dArray[row][column] = (double) iArray[row][column]; 
    } 
} 
संबंधित मुद्दे