Java'da bir dizinin tüm öğeleri belirli bir değere nasıl başlatılır


108

İçinde dileğimi yerine getirebilecek bir fonksiyona C/C++sahibiz, memset()ancak Javatüm öğeleri belirli bir değere nasıl başlatabilirim? Ne zaman yazarsak int[] array=new int[10];, bu basitçe tüm elemanları sıfıra eşit olan 10 boyutlu bir diziyi başlatır. Dizimden biri için bu ilklendirme tamsayısını değiştirmek istiyorum. yani, tüm elemanları eşit olan bir diziyi başlatmak istiyorum -1. Aksi halde ben bir koymak zorunda forsadece dizinden aralıkları başlatma sonrası döngü 0endeksine size-1ve bu döngü içinde, ben elemanı atama ediyorum -1. Daha fazla anlayış için kod aşağıdadır.

    int[] array = new int[10];
    for (int i = 0; i < size; i++) {
        array[i] = -1;
    }

Doğru mu gidiyorum? Aynısının başka bir yolu var mı?

Yanıtlar:


212

İlkel bir türse şunları kullanabilirsiniz Arrays.fill():

Arrays.fill(array, -1);

[ Bu arada, memsetC veya C ++ 'da yalnızca dizileri için herhangi bir gerçek kullanımdır char. ]


17
Kaynak kodunu kontrol ettim Arrays.fill(). Aynı şeyi yapıyor. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi

2
Evet. Olması gerektiği gibi. JIT'in temel uygulamayı iyileştirecek kadar akıllı olabileceğinden şüphelenmeme rağmen.
Louis Wasserman

1
Katılmıyorum. memsetDoldurmanız gerektiğinde 0veya -1örneğin DP problemlerinde tamsayı dizilerinde de kullanılabilir ve aslında çok kullanışlıdır .
Sнаđошƒаӽ

@ Sнаđошƒаӽ - Taşınabilir bir şekilde değil.
Oliver Charlesworth

1
Bilginize: Diğer tamsayı boyutları için memset_pattern4, 8 ve 16'yı kullanabilirsiniz.
geowar


5

Java 8 akışlarıyla da mümkündür:

int[] a = IntStream.generate(() -> value).limit(count).toArray();

Muhtemelen, işi yapmanın en verimli yolu değil.


Bu aynı zamanda ilkel olmayan türler ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();) için de işe yarar, dolayısıyla Arrays.fill () 'den daha esnektir. Yine de söylediğiniz gibi verimlilik konusunda emin değilim.
Christopher Riches

3

Kısa ise bunu yapabilirsin:

int[] array = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

ama bu bir kaçından fazlası için kötüleşiyor.

Daha kolay bir fordöngü olurdu :

  int[] myArray = new int[10];
  for (int i = 0; i < array.length; i++)
       myArray[i] = -1;

Düzenleme: Arrays.fill()Başkalarının bahsettiği seçeneği de seviyorum .


2 boyutlu bir diziyi başlatmak için herhangi bir hüküm var mı? int a [] [] = new int [3] [4] gibi bir şey; Arrays.fill (a, 1); böylece tüm 12 eleman -1 ile ayarlanacaktır.
PoornaChandra



0

Kullanabilirsiniz Arrays.fill(array, -1).


0

Belli ki Arrays.fill () 'i kullanabilirsiniz. Bunu yapma şekliniz de işe yarıyor.


Ya. Hatta Arrays.fill()bir kullanan forindeksi döngü 0için size-1. Benim yaptığım gibi. Cevabınız için teşekkür ederim.
Ravi Joshi

0

Java 8 kullanarak, basitçe kullanabilirsiniz ncopiesait Collectionssınıfının:

Object[] arrays = Collections.nCopies(size, object).stream().toArray();

Sizin durumunuzda:

Integer[] arrays = Collections.nCopies(10, Integer.valueOf(1)).stream().toArray(Integer[]::new);
.

İşte benzer bir durumunuzun ayrıntılı cevabı.


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.