Tüm dizi öğelerini sıfıra başlatmak için herhangi bir kısayol var mı?


281

Eskiden C/C++yapardım

int arr[10] = {0};

... tüm dizi öğelerimi 0 olarak başlatmak için.

Java'da benzer bir kısayol var mı?

Döngüyü kullanmaktan kaçınmak istiyorum, mümkün mü?

int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
    arr[i] = 0;
}

2
java.util.Arrays.fill () int [] arr = yeni int [10]; ve int arr [10] = {0}; hepsi dahili döngüler kullanır.
Kevin Kostlan

Yanıtlar:


574

İntegral tip diziler için varsayılan 0 değeri, spesifikasyon dili tarafından garanti edilir :

Her sınıf değişkeni, örnek değişkeni veya dizi bileşeni bir oluşturulduğunda varsayılan bir değerle (§15.9, §15.10) [...] Tür intiçin varsayılan değer sıfırdır, yani 0.  

Tek boyutlu bir diziyi farklı bir değere başlatmak istiyorsanız, java.util.Arrays.fill () öğesini kullanabilirsiniz (ki bu elbette dahili olarak bir döngü kullanır).


@MichaelBorgwardt Bana yardımcı oldu. Bu, döngü için karşılaştırıldığında aynı maliyete sahip olur mu?
maytham-ɯɐɥʇʎɐɯ

@ maytham-ɯɐɥıλɐɯ: Kaynak koduna bakabilirsiniz, JDK ile birlikte gelir. Bu tamamen aynıdır, yöntem döngü için mükemmel normal, basit bir şeyden ibaret değildir.
Michael Borgwardt

@MichaelBorgwardt 2 boyutlu yerel bir dizinin değerleri ne olacak? Bu "dizi bileşeni" altına giriyor mu?
Rishi

Arrays.fillmutlaka bir döngü kullanmaz.
NateS

@NateS: Java uygulaması olmayan bir örnek verebilir misiniz?
Michael Borgwardt

104

Diğer yanıtlar doğru olsa da (int dizi değerleri varsayılan olarak 0 olarak başlatılır), açıkça yapmak istiyorsanız (örneğin, 42 değeriyle doldurulmuş bir dizi istiyorsanız), Diziler sınıfı:

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

Veya 1 gömlekli bir hayranıysanız, Collections.nCopies()rutini kullanabilirsiniz :

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

Arr değerini verecekti:

[42, 42, 42]

(yine de Integer, ve değil int, ilkel tipe ihtiyacınız varsa, Apache CommonsArrayUtils.toPrimitive() rutinine erteleyebilirsiniz :

int [] primarr = ArrayUtils.toPrimitive(arr);

9
Tek gömlekleri iyi, ama List<Integer>hiç Integer[]için int[]? Biraz kıvrık.
dhardy

2
@dhardy Tabii, ama bu yüzden cevapta 2 satırlı bir sürüm de var ("kıvrık" faktöründen endişe ediyorsanız).
Adam Parkin

Arrays.fillyöntem ile 2d dizinin başlatılması sorun yaratıyor ve hata oluşuyor.
AKS

39

Java, bütün elemanlar (ilkel tamsayı türleri byte short, int, long) 0 varsayılan ilklendirildikten. Döngüyü kaydedebilirsiniz.


2
Sanırım bu ilkel tipler için geçerli mi ?!
Olimpiu POP

1
İnt gibi ilkel java türleri başlatılmaz.
Mirko Ebert

8
@ tfb785: Bu yanlış. Yukarıda Michael Borgwardt tarafından belirtildiği gibi: ilkel tamsayı türleri (kısa, int, uzun) 0 olarak başlatılır.
Arne Deutsch

1
Evet, int [] gibi bir java ilkel dizisi 0 ile başlatılır. Hayır, bir java ilkel tipi 0 ile başlatılmaz.
Mirko Ebert

3
Kesin olmak gerekirse: ilkel sınıf üyeleri (statik olsun olmasın) 0 ile başlatılır. Yerel değişkenler başlatılmaz.
Arne Deutsch

23

Uygulamanızın Performansını Nasıl Azaltır ....? Aşağıdaki okuyun.

Java Dil Belirtiminde, herhangi bir Nesne için Varsayılan / Başlangıç ​​Değeri Aşağıdaki gibi verilebilir.

Türü için byte , varsayılan değer olan sıfır olduğunu, (bayt) değeridir 0 .

Türü için Kısa , varsayılan değer olan sıfır olduğu, (kısa) değeri, 0 .

Tipi için int , varsayılan değer olan sıfır olduğunu, 0 .

Tipi için uzun , varsayılan değer olan sıfır olduğunu, 0L .

Tipi için şamandıra , varsayılan değer olan pozitif sıfır olduğu, 0.0f .

Türü için çift , varsayılan değer olan pozitif sıfır olduğu, 0.0d .

Tipi için Char , varsayılan değer olan boş 'olduğu karakteri, \ u0000 '.

Tipi için boolean , varsayılan değer olan false .

İçin Tüm referans tipleri , varsayılan değer olan boş .

Tüm bunları göz önünde bulundurarak dizi öğeleri için sıfır değerleri ile başlatmanız gerekmez, çünkü varsayılan olarak tüm dizi öğeleri int dizi için 0'dır.

Çünkü Dizi , tek bir türün sabit sayıda değerini tutan bir konteyner nesnesidir. Şimdi olduğu için dizinin tipi int nedenle tüm dizi öğeleri için varsayılan değeri dikkate olacak otomatik 0 o Çünkü int türünü tutan .

Şimdi düşünün dizi için dize türü böylece tüm dizi elemanları olduğu varsayılan değeri olan boş .

Neden yapmıyorsunuz ......?

Sorunuzda önerdiğiniz gibi döngü kullanarak boş değer atayabilirsiniz.

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

Ancak bunu yaparsanız, makine döngüsünde gereksiz bir kayıp olacaktır. çok sayıda dizinin olduğu uygulamanızda kullanırsanız ve bunu her dizi için yaparsanız, o zaman Uygulama Performansını önemli ölçüde etkileyecektir.

Makine çevriminin daha fazla kullanımı ==> Verileri işlemek için daha fazla zaman ==> Çıktı süresi önemli ölçüde artacaktır . böylece uygulama veri işlemeniz düşük bir seviye olarak değerlendirilebilir (bir seviyeye kadar yavaşlayın).


17

Döngüyü kaydedebilirsiniz, başlatma zaten 0'a yapılır. Yerel bir değişken için bile.

Ancak, okunabilirlik için parantezleri yerleştirdiğiniz yeri düzeltin (tanınan en iyi uygulama):

int[] arr = new int[10];

14

Float veya Integer kullanıyorsanız, böyle varsayılan bir değer atayabilirsiniz ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));

6

Mevcut dizi boyutunuzla yeni bir boş dizi oluşturabilir ve bunları dizinize geri atayabilirsiniz. Bu diğerinden daha hızlı olabilir. Snippet:

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

Sonuç:

0
0
0
0
0    
0
0
0
0

1

Evet, bir dizideki int değerleri sıfırlanır. Ama bunu garanti etmiyorsunuz. Oracle belgeleri bunun kötü bir kodlama uygulaması olduğunu belirtir.


Java Dili belirtimine göre, bölüm 15.10.2 , başlangıç ​​değerleri sağlamayan bir dizi oluşturma istisnasıyla bir dizi oluşturulursa, dizinin tüm öğeleri dizinin bileşen türü için varsayılan değere sıfırlanır - örn. 0 char [] durumunda. Bu bir garantidir; Oracle'a güvenmenin kötü bir uygulama olduğunu düşündüğüm için oldukça şaşırırdım.
Ian Robertson

1

İnt değerlerinin, herkesin belirttiği gibi, başlattıktan sonra zaten sıfırdır. Dizi değerlerini gerçekten sıfıra ayarlamanız ve bunu optimize etmek istediğiniz bir durum varsa, şunu kullanın System.arraycopy:

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

Bu, memcpyJRE uygulamalarının çoğunda veya tamamında kapakların altında kullanılır. Bunun gibi bir statikin birden çok iş parçacığında bile güvenli olduğuna dikkat edin, çünkü en kötü durum birden çok iş parçacığının yeniden tahsis edilmesizeros eşzamanlı olarak , bu da hiçbir şeye zarar vermez.

Arrays.fillDiğerlerinin de bahsettiği gibi kullanabilirsiniz . Arrays.fill olabilir kullanmakmemcpy akıllı JVM, ama muhtemelen sadece bir Java döngü ve bu gerektirir kontrol sınırları olduğunu.

Elbette optimizasyonlarınızı kıyaslayın.


1

Java 8 üzerinde lambda kullanarak başka bir yaklaşım

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);

1

C / cpp'de, sıfır diziyle tüm dizileri başlatmaktan başka bir kısayol yoktur.

  int arr[10] = {0};

Ancak java'da bir dizideki tüm değerleri seçtiğiniz tamsayı ile dolduracak Arrays.fill () adlı sihirli bir araç vardır.

  import java.util.Arrays;

    public class Main
    {
      public static void main(String[] args)
       {
         int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
         Arrays.fill(ar, 10);
         System.out.println("Array completely filled" +                          
            " with 10\n" + Arrays.toString(ar));
   }
 }

1

Java için int varsayılan değeri sıfır olduğu için sıfır durumunda başlatma gerekmez. Sıfır dışındaki değerler için java.util.Arraysbir dizi seçenek sunar, en basit olanı doldurma yöntemidir.

int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));  //[-1, -1, -1, -1, -1 ]

int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]

Koşul temelinde değer doldurmak istiyorsak Arrays.setAll () yöntemini de kullanabiliriz:

int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);

int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]

0

diziyi sınıfta örnek değişken olarak bildirir, yani her yöntemin dışında ve JVM varsayılan değer olarak 0 değerini verir. Artık endişelenmene gerek yok


-3
    int a=7, b=7 ,c=0,d=0;
    int dizi[][]=new int[a][b];
    for(int i=0;i<a;i++){
        for(int q=d;q<b;q++){
            dizi[i][q]=c;               
            System.out.print(dizi[i][q]);
            c++;
        }

        c-=b+1;
        System.out.println();               
    }

sonuç 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10

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.