ไวยากรณ์สำหรับสร้างอาร์เรย์สองมิติ


438

พิจารณา:

int[][] multD = new int[5][];
multD[0] = new int[10];

นี่เป็นวิธีที่คุณสร้างอาร์เรย์สองมิติที่มี 5 แถวและ 10 คอลัมน์หรือไม่

ฉันเห็นรหัสนี้ออนไลน์ แต่ไวยากรณ์ไม่สมเหตุสมผล


จ้ะยังสามารถกำหนดอาร์เรย์สองมิติว่ามี 10 คอลัมน์ในคำสั่งแรก int [] [] multD = new int [5] [10];
committedandroider

คำตอบ:


814

ลองทำสิ่งต่อไปนี้:

int[][] multi = new int[5][10];

... ซึ่งเป็นมือสั้น ๆ สำหรับสิ่งนี้:

int[][] multi = new int[5][];
multi[0] = new int[10];
multi[1] = new int[10];
multi[2] = new int[10];
multi[3] = new int[10];
multi[4] = new int[10];

หมายเหตุว่าองค์ประกอบทุกคนจะเริ่มต้นได้ที่ค่าเริ่มต้นสำหรับint, 0ดังนั้นข้างต้นนอกจากนี้ยังเทียบเท่ากับ:

int[][] multi = new int[][]{
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

27
ส่วนที่สนุกคือคุณสามารถมีคอลัมน์ต่างกันในแถวที่ต่างกันได้ ตัวอย่างเช่น: - int [] [] multi = new int [5] []; multi [0] = new int [10]; multi [1] = new int [6]; multi [2] = new int [9] ใช้ได้อย่างสมบูรณ์แบบ
JavaTec

2
สวัสดี Muneeb ถ้าฉันเข้าใจถูกต้องคุณถามในอาร์เรย์หลายมิติที่มีขนาดคอลัมน์ที่แตกต่างกันสำหรับแต่ละแถววิธีการกำหนดค่า นี่คือวิธี: int [] [] multi = new int [] [] {{1,2,3}, {1,2,3,4}, {1}}; และคุณสามารถเข้าถึง / พิมพ์ได้เช่น: สำหรับ (int i = 0; i <multi.length; i ++) {สำหรับ (int j = 0; j <multi [i] .length; j ++) {System.out.println ( "row:" + i + "คอลัมน์:" + j + "ค่า:" + หลาย [i] [j]); }}
JavaTec

1
เราจำเป็นต้องใช้new int[][]ใน=new int[][]{...}ตัวแปร? เราเขียนได้={...}ไหม
Nawaz

2
@Nawaz ไม่อาร์เรย์เป็น Object ใน java และหน่วยความจำถูกจัดสรรให้กับ Objects โดยใช้newคีย์เวิร์ดเท่านั้น
roottraveller

1
@Oldrinb เกี่ยวกับint array[][] = new int[3][];VS int array[][] = new int[][3];?? อันไหนถูกกฎหมายเพราะฉันได้อ่านทั้งสองรุ่นที่ไหนสักแห่ง
roottraveller

77

เราสามารถประกาศอาร์เรย์สองมิติและจัดเก็บองค์ประกอบโดยตรงในเวลาที่ประกาศเป็น:

int marks[][]={{50,60,55,67,70},{62,65,70,70,81},{72,66,77,80,69}};

ที่นี่intหมายถึงองค์ประกอบประเภทจำนวนเต็มเก็บไว้ในอาร์เรย์และชื่ออาร์เรย์คือ 'เครื่องหมาย' intเป็นประเภทข้อมูลสำหรับองค์ประกอบทั้งหมดที่อยู่ภายในวงเล็บปีกกา "{" และ "}" เพราะอาร์เรย์เป็นชุดขององค์ประกอบที่มีชนิดข้อมูลเดียวกัน

กลับมาที่คำแถลงของเราที่เขียนไว้ด้านบน: องค์ประกอบแต่ละแถวควรเขียนไว้ในเครื่องหมายปีกกา แถวและองค์ประกอบในแต่ละแถวควรคั่นด้วยเครื่องหมายจุลภาค

ตอนนี้สังเกตคำสั่ง: คุณสามารถรับมี 3 แถวและ 5 คอลัมน์ดังนั้น JVM สร้างหน่วยความจำ 3 * 5 = 15 บล็อก บล็อกเหล่านี้สามารถถูกอ้างอิงทีละตาว่า:

marks[0][0]  marks[0][1]  marks[0][2]  marks[0][3]  marks[0][4]
marks[1][0]  marks[1][1]  marks[1][2]  marks[1][3]  marks[1][4]
marks[2][0]  marks[2][1]  marks[2][2]  marks[2][3]  marks[2][4]


หมายเหตุ:
หากคุณต้องการเก็บnองค์ประกอบแล้วดัชนีอาร์เรย์เริ่มต้นจากศูนย์และสิ้นสุดที่n-1 อีกวิธีในการสร้างอาร์เรย์สองมิติคือการประกาศอาร์เรย์ก่อนแล้วจึงจัดสรรหน่วยความจำให้โดยใช้ตัวดำเนินการใหม่

int marks[][];           // declare marks array
marks = new int[3][5];   // allocate memory for storing 15 elements

โดยการรวมสองอย่างข้างต้นเราสามารถเขียน:

int marks[][] = new int[3][5];

ฉันคิดว่านี่เป็นวิธีที่เหมาะสมที่สุดในการป้อนข้อมูล
thanos.a

51

คุณสามารถสร้างพวกเขาในแบบที่คนอื่นพูดถึง อีกหนึ่งจุดที่จะเพิ่ม: คุณสามารถสร้างอาเรย์สองมิติที่เบ้กับแต่ละแถวได้โดยไม่จำเป็นต้องมีจำนวนคอลโมลเท่ากันเช่นนี้

int array[][] = new int[3][];
array[0] = new int[3];
array[1] = new int[2];
array[2] = new int[5];

5
พูดได้ดี! นี่คือสิ่งสำคัญที่สุดของการเริ่มต้นอย่างอิสระ
Ahamed

@Victor เกี่ยวกับint array[][] = new int[3][];VS int array[][] = new int[][3];?? อันไหนถูกกฎหมายเพราะฉันได้อ่านทั้งสองรุ่นที่ไหนสักแห่ง
roottraveller

30

สำนวนที่พบบ่อยที่สุดในการสร้างอาร์เรย์สองมิติที่มี5แถวและ10คอลัมน์คือ:

int[][] multD = new int[5][10];

หรือคุณสามารถใช้สิ่งต่อไปนี้ซึ่งคล้ายกับสิ่งที่คุณมีมากขึ้นแม้ว่าคุณจะต้องเริ่มต้นแต่ละแถวอย่างชัดเจน:

int[][] multD = new int[5][];
for (int i = 0; i < 5; i++) {
  multD[i] = new int[10];
}

3
ยังตระหนักว่ามีเพียงภาษาดั้งเดิมเท่านั้นที่ไม่ต้องการการเริ่มต้น หากคุณประกาศอาร์เรย์ดังกล่าวObject[][] ary2d = new Object[5][10];คุณจะต้องเริ่มต้นองค์ประกอบแต่ละส่วนของอาร์เรย์ 2D
อาร์มันด์

3
นอกจากว่าคุณจะจัดการกับnullคดีอย่างปลอดภัยสำหรับการตรวจสอบเบื้องต้นใด ๆ คุณควรเริ่มต้นองค์ประกอบแต่ละส่วนหรือไม่นั้นขึ้นอยู่กับการออกแบบของคุณ นอกจากนี้เพื่อชี้แจง - primitives ไม่สามารถเป็นโมฆะและรับอินสแตนซ์เป็นค่าเริ่มต้นที่กำหนดไว้หากคุณไม่ได้มอบหมายให้ เช่นintไม่สามารถเป็นโมฆะและเมื่อคุณพูดint i;โดยไม่กำหนดค่าระบบ0จะใช้ค่าเริ่มต้นหนึ่งค่า อ่านเกี่ยวกับที่นี่
ไม่เห็น

การชี้แจงเพิ่มเติมอีกหนึ่งค่าเริ่มต้นจะแจกให้กับตัวแปรคลาส / อินสแตนซ์เท่านั้น ตัวแปรท้องถิ่น (ภายในวิธีการ) จะต้องเริ่มต้นด้วยตนเองก่อนการใช้งาน
แบ่งแยก

12

นอกจากนี้ยังเป็นไปได้ที่จะประกาศด้วยวิธีต่อไปนี้ มันไม่ใช่การออกแบบที่ดี แต่ใช้งานได้

int[] twoDimIntArray[] = new int[5][10];

9

ลอง:

int[][] multD = new int[5][10];

โปรดทราบว่าในรหัสของคุณเฉพาะบรรทัดแรกของอาร์เรย์ 2D เท่านั้นที่เริ่มต้นเป็น 0 บรรทัดที่ 2 ถึง 5 ไม่มีอยู่ หากคุณพยายามที่จะพิมพ์พวกเขาคุณจะได้รับnullสำหรับทุกคน


8
int [][] twoDim = new int [5][5];

int a = (twoDim.length);//5
int b = (twoDim[0].length);//5

for(int i = 0; i < a; i++){ // 1 2 3 4 5
    for(int j = 0; j <b; j++) { // 1 2 3 4 5
        int x = (i+1)*(j+1);
        twoDim[i][j] = x;
        if (x<10) {
            System.out.print(" " + x + " ");
        } else {
            System.out.print(x + " ");
        }
    }//end of for J
    System.out.println();
}//end of for i

8

ใน Java อาร์เรย์สองมิติสามารถประกาศได้เช่นเดียวกับอาร์เรย์หนึ่งมิติ ในอาเรย์หนึ่งมิติคุณสามารถเขียนได้

  int array[] = new int[5];

โดยที่ int เป็นชนิดข้อมูล array [] เป็นการประกาศอาร์เรย์และnew arrayเป็นอาร์เรย์ที่มีวัตถุที่มีดัชนีห้าตัว

เช่นนั้นคุณสามารถเขียนอาร์เรย์สองมิติดังต่อไปนี้

  int array[][];
  array = new int[3][4];

นี่arrayคือประเภทข้อมูล int ฉันได้ประกาศครั้งแรกในอาร์เรย์หนึ่งมิติของประเภทนั้นแล้วแถว 3 และ 4 คอลัมน์จะถูกสร้างขึ้น

ในรหัสของคุณ

int[][] multD = new int[5][];
multD[0] = new int[10];

หมายความว่าคุณได้สร้างอาร์เรย์สองมิติโดยมีห้าแถว ในแถวแรกมี 10 คอลัมน์ ใน Java คุณสามารถเลือกขนาดคอลัมน์สำหรับทุกแถวได้ตามต้องการ


7
int rows = 5;
int cols = 10;

int[] multD = new int[rows * cols];

for (int r = 0; r < rows; r++)
{
  for (int c = 0; c < cols; c++)
  {
     int index = r * cols + c;
     multD[index] = index * 2;
  }
}

สนุก!


1
สิ่งนี้จะเป็นประโยชน์ในภาษาที่ไม่รองรับอาเรย์ 2 มิติเช่น C!
Alaa

3
C รองรับอาร์เรย์หลายมิติด้วย
Ricardo Cruz


3

อาร์เรย์ประเภทนี้เรียกว่า jagged arrays ใน Java:

int[][] multD = new int[3][];
multD[0] = new int[3];
multD[1] = new int[2];
multD[2] = new int[5];

ในสถานการณ์สมมตินี้แต่ละแถวของอาร์เรย์มีจำนวนคอลัมน์แตกต่างกัน ในตัวอย่างด้านบนแถวแรกจะมีสามคอลัมน์และแถวที่สองจะมีสองคอลัมน์และแถวที่สามมีห้าคอลัมน์ คุณสามารถเริ่มต้นอาร์เรย์นี้ในเวลารวบรวมเช่นด้านล่าง:

 int[][] multD = {{2, 4, 1}, {6, 8}, {7, 3, 6, 5, 1}};

คุณสามารถวนองค์ประกอบทั้งหมดในอาร์เรย์ของคุณได้อย่างง่ายดาย:

for (int i = 0; i<multD.length; i++) {
    for (int j = 0; j<multD[i].length; j++) {
        System.out.print(multD[i][j] + "\t");
    }
    System.out.println();
}

0

จริงๆแล้ว Java ไม่มีอาเรย์หลายมิติในแง่คณิตศาสตร์ สิ่งที่ Java มีเพียงอาร์เรย์ของอาร์เรย์ซึ่งเป็นที่ที่แต่ละองค์ประกอบเป็นอาร์เรย์ นั่นคือเหตุผลที่ความต้องการที่แน่นอนในการเริ่มต้นมันคือขนาดของมิติแรก หากส่วนที่เหลือมีการระบุแล้วมันจะสร้างอาร์เรย์ที่มีค่าเริ่มต้น

int[][]   ar  = new int[2][];
int[][][] ar  = new int[2][][];
int[][]   ar  = new int[2][2]; // 2x2 array with zeros

มันยังทำให้เราแปลกประหลาด ขนาดของอาร์เรย์ย่อยไม่สามารถเปลี่ยนแปลงได้โดยการเพิ่มองค์ประกอบเพิ่มเติม แต่เราสามารถทำได้โดยการกำหนดอาร์เรย์ใหม่ที่มีขนาดตามอำเภอใจ

int[][]   ar  = new int[2][2];
ar[1][3] = 10; // index out of bound
ar[1]    = new int[] {1,2,3,4,5,6}; // works
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.