Java'da 2D dizinin dizi uzunluğunu elde etme


129

Hem satır hem de sütun için bir 2D dizinin uzunluğunu almam gerekiyor. Aşağıdaki kodu kullanarak bunu başarıyla yaptım:

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

Bu beklendiği gibi 5, 10 yazdırır.

Şimdi şu satıra bir bakın:

  int col = test[0].length;

Sütun uzunluğunu elde etmek için aslında belirli bir satıra başvurmam gerektiğine dikkat edin. Bana göre bu inanılmaz derecede çirkin görünüyor. Ek olarak, dizi şu şekilde tanımlandıysa:

test = new int[0][10];

Daha sonra uzunluğu almaya çalışırken kod başarısız olur. Bunu yapmanın farklı (daha akıllı) bir yolu var mı?


Aşağıdaki referansı oldukça kapsamlı buldum, programiz.com/java-programming/multidimensional-array
Hossein Rahimi

Yanıtlar:


182

Düşünmek

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
}

Sütun uzunlukları satır başına farklılık gösterir. Bazı verileri sabit boyutlu bir 2D diziyle yedekliyorsanız, bir sarmalayıcı sınıfındaki sabit değerlere alıcılar sağlayın.


1
Cevabınız hakkında alakasız soru. "{...}" koyduğunuz yere denen teknik / yöntem nedir; nesne tanımından sonra. Yeni bir geliştirici olarak bunu giderek daha fazla görüyorum.
user432209

Pekala, bunu çok anlıyorum :). Tekniğin belirli bir adı olabileceğini düşündüm.
user432209

Adının ne olduğundan emin değil misiniz - nesne başlatma? satır içi başlatma? Java Ustalarımızdan biri bilecek
NG.

8
JLS 10.6 ve 15.10'a göre, küme parantezleri kısmı sadece bir Dizi Başlatıcı iken, yeniyle başlayan her şey bir Dizi Oluşturma İfadesi'dir.
ILMTitan

17

2B bir dizi dikdörtgen bir ızgara değildir. Ya da belki daha iyisi, Java'da 2D dizi diye bir şey yoktur.

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

çıktılar

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

Diziler testve test2(aşağı yukarı) aynıdır.


12

Bunu hatırlamak gerçekten zordu

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

Bunun neden böyle olduğunu ve bize bir dizi problemi verildiğinde bunu nasıl anlayabileceğimizi anlayalım. Aşağıdaki koddan satırların = 4 ve sütunların = 3 olduğunu görebiliriz:

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

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arriçinde birden fazla diziye sahiptir ve bu diziler sütun sayısını elde etmek için dikey olarak düzenlenebilir. Satır sayısını elde etmek için ilk diziye erişmemiz ve uzunluğunu düşünmemiz gerekir. Bu durumda [1, 1, 1, 1] 'e ve dolayısıyla satır sayısı = 4'e erişiriz. Diziyi göremediğiniz bir problemle karşılaştığınızda, diziyi bir dikdörtgen olarak görselleştirebilirsiniz. n X m boyutlar ve ilk diziye sonra uzunluğuna erişerek satır sayısını elde edebileceğimiz sonucuna varalım. Diğeri ( arr.length) sütunlar içindir.


8
Bu geriye doğru var. "Bu durumda, [1, 1, 1, 1] 'e erişiriz ve dolayısıyla satır sayısı = 4'tür." Aslında, bu 4 sütun olduğu anlamına gelir.
Evan Rosica

Doğru @Evan Rosica
Nitin Nanda

5

Java, her "satırın" farklı uzunluklara sahip olduğu "düzensiz diziler" oluşturmanıza izin verir. Bir kare diziniz olduğunu biliyorsanız, aşağıdaki gibi boş bir diziye karşı koruma sağlamak için değiştirilmiş kodunuzu kullanabilirsiniz:

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

4

Bu diziye sahipseniz:

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

Bunu yapabilirsiniz:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


Daha önce benzer bir cevap görmüştüm ama örneklerle anlamak daha kolay bence!

3

Dil düzeyinde daha net bir yol yoktur çünkü çok boyutlu dizilerin tümü dikdörtgen değildir. Bazen pürüzlü (farklı sütun uzunlukları) diziler gereklidir.

İhtiyaç duyduğunuz işlevselliği soyutlamak için kendi sınıfınızı kolayca oluşturabilirsiniz.

Dizilerle sınırlı değilseniz, belki bir Multimap gibi çeşitli koleksiyon sınıflarından bazıları da işe yarayabilir .


1

.length = satır sayısı / sütun uzunluğu

[0] .length = sütun sayısı / satır uzunluğu


1
SO'ya hoş geldiniz. Cevabınıza biraz daha açıklama eklemelisiniz.
m02ph3u5

0

Java'da 2d dizisi için aşağıdaki programı deneyin:

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

Basacak [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] ondalık noktayı kaybetmek için ints'e dönüştürülür. Bu çözüm, girdi dizinizin her zaman ([x] [1]) boyutunda olacağını varsayar
RobynVG

0

İle Java 8, bunun gibi daha zarif bir şey yapmanıza izin verin:

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
bu soruyla ilgili değil
alfonso.kim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.