2009-11-13 23 views
12

में कनवर्ट करें मेरे पास शतरंज संस्करण के लिए दो एरे हैं जो मैं जावा में कोडिंग कर रहा हूं ... मेरे पास अब तक एक कंसोल संस्करण है जो बोर्ड को 1 डी सरणी (आकार 32 है) के रूप में दर्शाता है लेकिन मैं मैं इसके लिए एक जीयूआई बनाने पर काम कर रहा हूं और मैं इसे 4x8 ग्रिड के रूप में दिखाना चाहता हूं, इसलिए मेरे पास जेपीनेल की 2-आयामी सरणी है ...एक 2 डी इंडेक्स को 1 डी इंडेक्स

प्रश्न यह है कि क्या कोई सूत्र है जो सरणी को परिवर्तित कर सकता है [i ] [जे] सरणी में सूचकांक [i] तथ्य यह एक 4x8 सरणी दिया?

उत्तर

15

को देखते हुए 4 से 8 पंक्तियों तब तक कॉलम:

i = row * 4 + col 

संपादित करें: मेरा बुरा, कोई भी जाहिरा तौर पर इस गलती पर मुझे पकड़ लिया। लेकिन यह वास्तव में row * 4 + col होना चाहिए।

row * 8 + col संभावित अनुक्रमणिका में अनावश्यक अंतराल छोड़ देगा।

+0

मैं विश्वास नहीं कर सकता मैं नहीं मिला है कि lol ... मैं था (मैं * 4) + (i * 8) कोई आश्चर्य नहीं कि यह सीमा से बाहर था, धन्यवाद! – Becky

+0

आपका बहुत स्वागत है। मुझे हाल ही में एक टिक टैक पैर गेम के साथ एक ही चीज़ करना था जो सीखता है। एक ही सूचकांक के रूप में पिछले कदमों को संग्रहीत करना दक्षता में सुधार की दिशा में एक कदम था। –

+0

मैं हमेशा इस उत्तर में वापस आ रहा हूं, किसी कारण से मुझे इस समीकरण 'इंडेक्स = एक्स + वाई * num_cols को याद रखने का कोई तरीका नहीं मिल रहा है;' यह जोड़ना अच्छा होगा कि हम इसे कैसे घटाते हैं! – vexe

3

i*8+j (क्षैतिज चौड़ाई संभालने 8 है)

8

आपके 2 डी सरणी में प्रत्येक पंक्ति को आपके 1 डी सरणी में समाप्त करने के लिए अंत में रखा गया है। i देता है कि आप किस पंक्ति में हैं, और j कॉलम (उस पंक्ति में कितनी दूर) देता है। इसलिए यदि आप ith पंक्ति में हैं, तो आपको i पूर्ण पंक्तियों को समाप्त होने की आवश्यकता है, फिर j को अपनी एकल सरणी अनुक्रमणिका प्राप्त करने के लिए उस पर और अधिक संलग्न करना होगा।

तो यह हो जाएगा की तरह
singleDimIndex = array[0].length * i + j

17

इसके बारे में लगता है कि इस तरह से कुछ:

आप एक सरणी है कि एक 1 आयामी सरणी, जो वास्तव में, बस आइटम की एक लंबी संयोजन है होने वाला है एक दो आयामी सरणी का।

तो, कहें कि आपके पास आकार 5 x 3 (5 पंक्तियां, 3 कॉलम) की दो आयामी सरणी है। और हम एक आयामी सरणी बनाना चाहते हैं। आपको यह तय करने की ज़रूरत है कि क्या आप पंक्तियों या स्तंभों से जोड़ना चाहते हैं, इस उदाहरण के लिए हम कहेंगे कि संगतता पंक्तियों से है। इसलिए, प्रत्येक पंक्ति 3 कॉलम लंबी होती है, इसलिए आपको अपने एक-आयामी सरणी को 3 के "चरणों" में परिभाषित करने की आवश्यकता होती है। इसलिए, आपके एक आयामी सरणी की लंबाई 5 x 3 = 15 होगी, और अब आप पहुंच बिंदु खोजने की जरूरत है।

तो, कहें कि आप दूसरी पंक्ति और अपने दो आयामी सरणी के दूसरे कॉलम तक पहुंच रहे हैं, फिर यह 3 चरणों (पहली पंक्ति) + दूसरी पंक्ति में चरणों की संख्या, या 3 + 2 = 5. जब से हम शून्य आधारित अनुक्रमण कि है -1 कर रहे हैं, ताकि विशिष्ट तैयार करने के लिए 4.

अब सूचकांक में होगा:,

int oneDindex = (row * length_of_row) + column; // Indexes 

तो तुम ऊपर का एक उदाहरण हवा के रूप में

oneDindex = (1 * 3) + 1 

और यह

+1

बढ़िया! फॉर्मूला कैसे प्राप्त करें, यह बताने के लिए बहुत बहुत धन्यवाद! – teo

+0

@ माइकल यह एक महान स्पष्टीकरण था और यहां तक ​​कि +1 भी है, लेकिन क्या आप इसे विस्तारित कर सकते हैं "तो, कहें कि आप दूसरी पंक्ति और अपने दो आयामी सरणी के दूसरे कॉलम तक पहुंच रहे हैं, तो यह 3 चरणों (पहली पंक्ति)) + दूसरी पंक्ति में चरणों की संख्या, या 3 + 2 = 5. चूंकि हम शून्य-आधारित इंडेक्सिंग -1 हैं, इसलिए यह सूचकांक 4 पर होगा। " बेहतर। इसे बेहतर समझाओ। –

0

होना चाहिए आप 1 डी सरणी और पीछे में 2 डी सरणी को परिवर्तित करने के लिए इस ArrayConvertor क्लास का उपयोग कर सकते हैं।

सावधान रहें: एक सामान्य डी में 2 डी सरणी को परिवर्तित करना केवल मैट्रिक्स के साथ काम करता है।

public class ArrayConvertor { 
    static public int[] d2Tod1(int[][] array){ 

     int[] newArray = new int[array.length*array[0].length]; 

     for (int i = 0; i < array.length; ++i) 
     for (int j = 0; j < array[i].length; ++j) { 
      newArray[i*array[0].length+j] = array[i][j]; 
     } 

     return newArray; 
    } 

    static public int[][] d1Tod2(int[] array, int width){ 

     int[][] newArray = new int[array.length/width][width]; 

     for (int i = 0; i < array.length; ++i) { 
      newArray[i/width][i%width] = array[i]; 
     } 

     return newArray; 
    } 
} 

और कुछ परीक्षण कोड:

public class JavaMain{ 
    public static void main(String[] args) { 
     int[][] arr2D_1 = new int[4][8]; 

     byte counter=0; 
     for (int i = 0; i < 4; i++) 
     for (int j = 0; j < 8; j++) { 
      arr2D_1[i][j] = counter++; 
     } 

     int[]arr1D = ArrayConvertor.d2Tod1(arr2D_1); 
     int[][] arr2D_2 = ArrayConvertor.d1Tod2(arr1D, 8); 

     boolean equal = true; 
     for (int i = 0; i < arr2D_1.length; i++) 
     for (int j = 0; j < arr2D_1[0].length; j++){ 
      if(arr2D_1[i][j]!=arr2D_2[i][j]) equal=false; 
     } 

     System.out.println("Equal: "+equal); 
    } 
} 

आउटपुट: बराबर: सच

+0

मुझे नहीं लगता कि यह काम करता है यदि आपके पास 8 से बड़ा सरणी है !! – schwiz

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