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?

pengguna432209
sumber
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.

NG.
sumber
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.

Ishtar
sumber
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.

gocode
sumber
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;
robert_x44
sumber
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


sumber
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 .

Kaliatech
sumber
1

.length = jumlah baris / panjang kolom

[0] .length = jumlah kolom / panjang baris

asdfgghjkll
sumber
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;
        }
    }
}
Pampanagouda Karmanchi
sumber
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));   
    }
}
RobynVG
sumber
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
logbasex
sumber
-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();
   }  
  }
Peter
sumber
1
ini tidak terkait dengan pertanyaan
alfonso.kim