รับความยาวของอาร์เรย์ของอาร์เรย์ 2 มิติใน Java


129

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

public class MyClass {

 public static void main(String args[])
    {
  int[][] test; 
  test = new int[5][10];

  int row = test.length;
  int col = test[0].length;

  System.out.println(row);
  System.out.println(col);
    }
}

พิมพ์ออกมา 5, 10 ตามที่คาดไว้

ตอนนี้ดูที่บรรทัดนี้:

  int col = test[0].length;

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

test = new int[0][10];

จากนั้นรหัสจะล้มเหลวเมื่อพยายามรับความยาว มีวิธีที่แตกต่าง (ฉลาดกว่า) ในการทำสิ่งนี้หรือไม่?


ฉันพบการอ้างอิงต่อไปนี้ค่อนข้างครอบคลุมprogramiz.com/java-programming/multidimensional-array
Hossein Rahimi

คำตอบ:


182

พิจารณา

public static void main(String[] args) {

    int[][] foo = new int[][] {
        new int[] { 1, 2, 3 },
        new int[] { 1, 2, 3, 4},
    };

    System.out.println(foo.length); //2
    System.out.println(foo[0].length); //3
    System.out.println(foo[1].length); //4
}

ความยาวคอลัมน์แตกต่างกันไปในแต่ละแถว หากคุณกำลังสำรองข้อมูลด้วยอาร์เรย์ 2D ขนาดคงที่จากนั้นให้ getters กับค่าคงที่ในคลาส wrapper


1
คำถามที่ไม่เกี่ยวข้องกับคำตอบของคุณ อะไรคือเทคนิค / วิธีการที่คุณใส่ "{... };" หลังจากการกำหนดวัตถุ ในฐานะนักพัฒนาใหม่ฉันเห็นสิ่งนี้มากขึ้นเรื่อย ๆ
user432209

ฉันเข้าใจมาก :) ฉันแค่คิดว่าอาจมีชื่อเฉพาะสำหรับเทคนิค
user432209

ไม่แน่ใจว่าชื่อมันคืออะไร - การเริ่มต้นวัตถุ? การเริ่มต้นแบบอินไลน์? หนึ่งในผู้เชี่ยวชาญของ Java ของเราจะรู้
NG

8
ต่อ JLS 10.6 และ 15.10 ส่วนของเครื่องหมายปีกกาแบบโค้งเป็นเพียงเครื่องมืออาเรย์เริ่มต้นในขณะที่สิ่งที่เริ่มต้นใหม่ทั้งหมดคือการแสดงออกของอาเรย์ครีเอชั่น
ILMTitan

17

อาร์เรย์ 2D ไม่ใช่ตารางสี่เหลี่ยม หรืออาจจะดีกว่านี้ไม่มีสิ่งเช่นอาเรย์ 2 มิติใน Java

import java.util.Arrays;

public class Main {
  public static void main(String args[]) {

    int[][] test; 
    test = new int[5][];//'2D array'
    for (int i=0;i<test.length;i++)
      test[i] = new int[i];

    System.out.println(Arrays.deepToString(test));

    Object[] test2; 
    test2 = new Object[5];//array of objects
    for (int i=0;i<test2.length;i++)
      test2[i] = new int[i];//array is a object too

    System.out.println(Arrays.deepToString(test2));
  }
}

เอาท์พุท

[[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]
[[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]

อาร์เรย์testและtest2เป็น (มากหรือน้อยกว่า) เหมือนกัน


12

มันยากที่จะจำได้

    int numberOfColumns = arr.length;
    int numberOfRows = arr[0].length;

มาทำความเข้าใจกันว่าทำไมมันถึงเป็นเช่นนั้นและเราจะหาสาเหตุได้อย่างไรเมื่อเราได้รับปัญหาเรื่องอาร์เรย์ จากรหัสด้านล่างเราจะเห็นว่าแถว = 4 และคอลัมน์ = 3:

    int[][] arr = { {1, 1, 1, 1}, 

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arrมีหลายอาร์เรย์ในนั้นและอาร์เรย์เหล่านี้สามารถจัดเรียงในลักษณะแนวตั้งเพื่อรับจำนวนคอลัมน์ ในการรับจำนวนแถวเราจำเป็นต้องเข้าถึงอาร์เรย์แรกและพิจารณาความยาว ในกรณีนี้เราเข้าถึง [1, 1, 1, 1] ดังนั้นจำนวนแถว = 4 เมื่อคุณได้รับปัญหาที่คุณไม่สามารถมองเห็นอาร์เรย์คุณสามารถเห็นภาพอาร์เรย์เป็นรูปสี่เหลี่ยมผืนผ้าด้วย ขนาด X m และสรุปว่าเราสามารถรับจำนวนแถวได้โดยเข้าถึงอาร์เรย์แรกตามด้วยความยาว อีกอันหนึ่ง ( arr.length) สำหรับคอลัมน์


8
คุณมีสิ่งนี้ย้อนหลัง "ในกรณีนี้เราเข้าถึง [1, 1, 1, 1] ดังนั้นจำนวนแถว = 4" จริงๆแล้วนั่นหมายความว่ามี 4 คอลัมน์
Evan Rosica

ถูกต้อง @Evan Rosica
Nitin Nanda

5

Java อนุญาตให้คุณสร้าง "ragged arrays" โดยที่ "row" แต่ละอันมีความยาวต่างกัน หากคุณรู้ว่าคุณมีสแควร์อาเรย์คุณสามารถใช้รหัสของคุณแก้ไขเพื่อป้องกันอาร์เรย์ว่างเปล่าเช่นนี้

if (row > 0) col = test[0].length;

4

หากคุณมีอาร์เรย์นี้:

String [][] example = {{{"Please!", "Thanks"}, {"Hello!", "Hey", "Hi!"}},
                       {{"Why?", "Where?", "When?", "Who?"}, {"Yes!"}}};

คุณสามารถทำได้:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


ฉันเห็นคำตอบที่คล้ายกันมาก่อน แต่ฉันคิดว่ามันง่ายกว่าที่จะเข้าใจตัวอย่าง!

3

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

คุณสามารถสร้างชั้นเรียนของคุณเองเพื่อสรุปฟังก์ชั่นที่คุณต้องการ

ถ้าคุณไม่ได้ จำกัด อยู่ที่อาร์เรย์แล้วบางทีบางส่วนของชั้นเรียนคอลเลกชันต่างๆจะทำงานได้เป็นอย่างดีเช่นMultimap


1

.length = จำนวนแถว / ความยาวคอลัมน์

[0] .length = จำนวนคอลัมน์ / ความยาวแถว


1
ยินดีต้อนรับสู่ SO คุณควรเพิ่มคำอธิบายเพิ่มเติมลงในคำตอบของคุณ
m02ph3u5

0

ลองโปรแกรมต่อไปนี้สำหรับอาร์เรย์ 2d ใน java:

public class ArrayTwo2 {
    public static void main(String[] args) throws  IOException,NumberFormatException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int[][] a;
        int sum=0;
        a=new int[3][2];
        System.out.println("Enter array with 5 elements");
        for(int i=0;i<a.length;i++)
        {
            for(int j=0;j<a[0].length;j++)
            {
            a[i][j]=Integer.parseInt(br.readLine());
            }
        }
        for(int i=0;i<a.length;i++)
        {
            for(int j=0;j<a[0].length;j++)
            {
            System.out.print(a[i][j]+"  ");
            sum=sum+a[i][j];
            }
        System.out.println();   
        //System.out.println("Array Sum: "+sum);
        sum=0;
        }
    }
}

0
import java.util.Arrays;

public class Main {

    public static void main(String[] args) 
    {

        double[][] test = { {100}, {200}, {300}, {400}, {500}, {600}, {700}, {800}, {900}, {1000}};

        int [][] removeRow = { {0}, {1}, {3}, {4}, };

        double[][] newTest = new double[test.length - removeRow.length][test[0].length];

        for (int i = 0, j = 0, k = 0; i < test.length; i++) {
            if (j < removeRow.length) {
                if (i == removeRow[j][0]) {
                    j++;
                    continue;
                }
            }
            newTest[k][0] = test[i][0];
            k++;
        }

        System.out.println(Arrays.deepToString(newTest));   
    }
}

จะพิมพ์ [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] แปลงเป็น ints เพื่อเสียจุดทศนิยม วิธีแก้ปัญหานี้จะถือว่าอาร์เรย์อินพุตของคุณมีขนาดเสมอ ([x] [1])
RobynVG

0

ด้วยJava 8ช่วยให้คุณทำสิ่งที่หรูหรามากขึ้นเช่นนี้:

int[][] foo = new int[][] {
        new int[] { 1, 2, 3 },
        new int[] { 1, 2, 3, 4},
    };

int length = Arrays.stream(array).max(Comparator.comparingInt(ArrayUtils::getLength)).get().length

-2
public class Array_2D {
int arr[][];
public Array_2D() {
    Random r=new Random(10);
     arr = new int[5][10];
     for(int i=0;i<5;i++)
     {
         for(int j=0;j<10;j++)
         {
             arr[i][j]=(int)r.nextInt(10);
         }
     }
 }
  public void display()
  {
         for(int i=0;i<5;i++)

         {
             for(int j=0;j<10;j++)
             {
                 System.out.print(arr[i][j]+" "); 
             }
             System.out.println("");
         }
   }
     public static void main(String[] args) {
     Array_2D s=new Array_2D();
     s.display();
   }  
  }

1
นี่ไม่เกี่ยวข้องกับคำถาม
alfonso.kim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.