Java: For loop init'te birden çok değişkeni başlat?


92

Farklı türlerde iki döngü değişkenine sahip olmak istiyorum. Bunu çalıştırmanın bir yolu var mı?

@Override
public T get(int index) throws IndexOutOfBoundsException {
    // syntax error on first 'int'
    for (Node<T> current = first, int currentIndex; current != null; 
            current = current.next, currentIndex++) {
        if (currentIndex == index) {
            return current.datum;
        }
    }
    throw new IndexOutOfBoundsException();
}

Nedir first? Hiçbir yerde beyan edilmemiştir. Sınıf üyesi mi?
extraneon

7
Aşağıdaki bir yanıtı kabul etmelisiniz
Mr_and_Mrs_D

Ve C'den farklı olarak, Java'nın virgül operatörü yoktur: stackoverflow.com/questions/12601596/… , bu da farklı türlerdeki iki değişkeni başlatmaya (ancak bildirmeme) izin verir.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@Nick Heiner Lütfen aşağıdaki cevaplardan birini kabul edildi olarak işaretler misiniz?
James Monger

Yanıtlar:


105

Bir başlatmafor ifadesi için kurallarını takip yerel değişken bildirimleri .

Bu yasal olacaktır (aptalca olsa):

for (int a = 0, b[] = { 1 }, c[][] = { { 1 }, { 2 } }; a < 10; a++) {
  // something
}

Ancak farklı Nodeve inttürleri istediğiniz gibi bildirmeye çalışmak yerel değişken bildirimleri için yasal değildir.

Yöntemler içindeki ek değişkenlerin kapsamını aşağıdaki gibi bir blok kullanarak sınırlayabilirsiniz:

{
  int n = 0;
  for (Object o = new Object();/* expr */;/* expr */) {
    // do something
  }
}

Bu, değişkeni yöntemin başka bir yerinde yanlışlıkla tekrar kullanmamanızı sağlar.


10
Dil tasarımcılarının bu görünüşte gereksiz kısıtlamayı neden uyguladıkları hakkında bir fikri olan var mı?
Jeff Axelrod

@glenviewjeff - en iyisi ayrı bir soru olarak sorulur.
McDowell

2
: @JeffAxelrod, belki tarihsel nedenlerle Java ++ ... Bu yayını görebilecek C model alınarak çünkü stackoverflow.com/questions/2687392/...
Christophe Roussy

3
Bir blok kullanmak için 1, hala onlara daha iyi saçma hatalar yapmaktan daha bir çok kullanmak
Christophe ROUSSY

18

Bundan hoşlanamazsın. Ya aynı türde birden çok değişken kullanırsınız for(Object var1 = null, var2 = null; ...)ya da diğer değişkeni çıkarır ve for döngüsünden önce bildirirsiniz.


9

Değişken bildirimlerini ( Node<T> current, int currentIndex) döngünün dışına taşıyın ve çalışmalıdır. Bunun gibi bir şey

int currentIndex;
Node<T> current;
for (current = first; current != null; current = current.next, currentIndex++) {

ya da belki

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {

1
Hiçbiri derlenmeyecek: kullanmadan önce değişkenleri başlatmalısınız.
unbeli

@unbeli iyi, manuel kod derlemede alıştırma yapmıyordum :) Sadece fikir vermek istedim.
Nikita Rybak

3
@unbeli: Sadece açıklığa kavuşturmak için: currentIndex'in başlatılması gerekiyor. Nikita'nın ona yaptığı ilk şey, doğal olarak soruyu gündeme getiren, neyi artıran "currentIndex ++" dır. akım iyidir çünkü ilk kullanım onu ​​ilk olarak ayarlamaktır.
Jay

Genellikle, bir for döngüsünde bir artış yazmayı daha iyi hale getirmek için, derleyiciden var ++ gösterimi olarak, var ++ 'yı çoğaltmadan önce onu ifadenin sonucu olarak döndürmeden önce , hiç kimse istemese de, var ++ gösterimi olarak kullanmalısınız . Elbette, derleyici bunu optimize edecek ancak bu, başkalarının temizlenmesini bekleyerek yola çöp atmak gibidir.
Chucky

5

Başlatma bloğunda bildirilen değişkenler aynı tipte olmalıdır

for döngüsündeki farklı veri türlerini tasarımlarına göre başlatamayız. Ben sadece küçük bir örnek veriyorum.

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
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.