Mendapatkan panjang array dari array 2D di Jawa


129

Saya perlu mendapatkan panjang array 2D untuk baris dan kolom. Saya telah berhasil melakukan ini, menggunakan kode berikut:

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);
    }
}

Ini mencetak 5, 10 seperti yang diharapkan.

Sekarang lihat baris ini:

  int col = test[0].length;

Perhatikan bahwa saya sebenarnya harus mereferensikan baris tertentu, untuk mendapatkan panjang kolom. Bagi saya, ini tampak sangat buruk. Selain itu, jika array didefinisikan sebagai:

test = new int[0][10];

Maka kode akan gagal ketika mencoba untuk mendapatkan panjangnya. Apakah ada cara berbeda (lebih cerdas) untuk melakukan ini?


Saya menemukan referensi berikut cukup komprehensif, programiz.com/java-programming/multidimensional-array
Hossein Rahimi

Jawaban:


182

Mempertimbangkan

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
}

Panjang kolom berbeda per baris. Jika Anda mencadangkan beberapa data dengan array 2D ukuran tetap, maka berikan getter ke nilai tetap di kelas wrapper.


1
Pertanyaan yang tidak terkait tentang jawaban Anda. Apa teknik / metode yang disebut tempat Anda meletakkan "{...};" setelah definisi objek. Sebagai pengembang baru saya terus melihat ini semakin banyak.
user432209

Yah, saya mengerti banyak :). Saya hanya berpikir mungkin ada nama spesifik untuk teknik ini.
user432209

Tidak yakin apa nama itu - inisialisasi objek? inisialisasi inline? salah satu Guru Jawa kami akan tahu
NG.

8
Per JLS 10.6 dan 15.10, bagian kurung kurawal hanyalah sebuah Array Initializer, sedangkan keseluruhannya dimulai dengan yang baru adalah Array Creation Expression.
ILMTitan

17

Array 2D bukan kisi persegi panjang. Atau mungkin lebih baik, tidak ada yang namanya array 2D di Jawa.

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));
  }
}

Keluaran

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

Array testdan test2(kurang lebih) sama.


12

Sangat sulit untuk mengingatnya

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

Mari kita pahami mengapa hal ini terjadi dan bagaimana kita dapat mengetahui hal ini ketika kita diberi masalah array. Dari kode di bawah ini kita dapat melihat bahwa baris = 4 dan kolom = 3:

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

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arrmemiliki banyak array di dalamnya, dan array ini dapat diatur secara vertikal untuk mendapatkan jumlah kolom. Untuk mendapatkan jumlah baris, kita perlu mengakses array pertama dan mempertimbangkan panjangnya. Dalam hal ini, kita mengakses [1, 1, 1, 1] dan dengan demikian, jumlah baris = 4. Ketika Anda diberi masalah di mana Anda tidak dapat melihat array, Anda dapat memvisualisasikan array sebagai persegi panjang dengan n Xm dimensi dan menyimpulkan bahwa kita bisa mendapatkan jumlah baris dengan mengakses array pertama lalu panjangnya. Yang lain ( arr.length) adalah untuk kolom.


8
Anda memiliki ini mundur. "Dalam hal ini, kami mengakses [1, 1, 1, 1] dan dengan demikian, jumlah baris = 4." Sebenarnya, itu berarti ada 4 kolom.
Evan Rosica

Benar @Evan Rosica
Nitin Nanda

5

Java memungkinkan Anda membuat "array kasar" di mana setiap "baris" memiliki panjang yang berbeda. Jika Anda tahu Anda memiliki array persegi, Anda dapat menggunakan kode Anda yang dimodifikasi untuk melindungi terhadap array kosong seperti ini:

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

4

Jika Anda memiliki array ini:

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

Kamu bisa melakukan ini:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


Saya melihat jawaban yang sama sebelumnya, tetapi saya pikir lebih mudah untuk dipahami dengan contoh!

3

Tidak ada cara yang lebih bersih di tingkat bahasa karena tidak semua array multidimensi berbentuk persegi panjang. Kadang-kadang array bergerigi (panjang kolom berbeda) diperlukan.

Anda dapat dengan mudah membuat kelas sendiri untuk abstrak fungsi yang Anda butuhkan.

Jika Anda tidak terbatas pada array, maka mungkin beberapa dari berbagai kelas koleksi akan berfungsi juga, seperti Multimap .


1

.length = jumlah baris / panjang kolom

[0] .length = jumlah kolom / panjang baris


1
Selamat datang di SO. Anda harus menambahkan beberapa penjelasan untuk jawaban Anda.
m02ph3u5

0

Coba program berikut ini untuk array 2d di 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));   
    }
}

Akan mencetak [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] dikonversi ke int untuk kehilangan titik desimal. Solusi ini mengasumsikan array input Anda akan selalu berukuran ([x] [1])
RobynVG

0

Dengan Java 8, memungkinkan Anda melakukan sesuatu yang lebih elegan seperti ini:

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
ini tidak terkait dengan pertanyaan
alfonso.kim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.