Java: Inisialisasi banyak variabel di for loop init?


92

Saya ingin memiliki dua variabel loop dari jenis yang berbeda. Apakah ada cara untuk membuatnya berhasil?

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

Apa first? Itu tidak diumumkan di mana pun. Apakah itu anggota kelas?
extraneon

7
Anda harus menerima satu jawaban di bawah
Mr_and_Mrs_D

Dan tidak seperti C, Java tidak memiliki operator koma: stackoverflow.com/questions/12601596/… , yang memungkinkan untuk menginisialisasi (tetapi tidak mendeklarasikan) dua variabel dari tipe yang berbeda.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@Nick Heiner Bisakah Anda menandai salah satu dari jawaban di bawah ini sebagai diterima?
James Monger

Jawaban:


105

The inisialisasi darifor pernyataan mengikuti aturan untuk deklarasi variabel lokal .

Ini akan legal (jika konyol):

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

Tetapi mencoba untuk mendeklarasikan perbedaan Nodedan inttipe yang Anda inginkan tidak legal untuk deklarasi variabel lokal.

Anda dapat membatasi ruang lingkup variabel tambahan dalam metode dengan menggunakan blok seperti ini:

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

Ini memastikan bahwa Anda tidak secara tidak sengaja menggunakan kembali variabel di tempat lain dalam metode.


10
Adakah yang tahu mengapa desainer bahasa menerapkan batasan yang tampaknya tidak perlu ini?
Jeff Axelrod

@glenviewjeff - sebaiknya ditanyakan sebagai pertanyaan terpisah.
McDowell

2
@JeffAxelrod, mungkin karena alasan historis karena Java dimodelkan setelah C ++ ... lihat posting ini: stackoverflow.com/questions/2687392/…
Christophe Roussy

3
+1 untuk menggunakan blok, saya sering menggunakannya, masih lebih baik daripada melakukan kesalahan konyol
Christophe Roussy

18

Anda tidak bisa menyukai ini. Anda bisa menggunakan beberapa variabel dengan tipe yang sama for(Object var1 = null, var2 = null; ...)atau mengekstrak variabel lain dan mendeklarasikannya sebelum perulangan for.


9

Pindahkan saja deklarasi variabel ( Node<T> current, int currentIndex) di luar loop dan itu akan berfungsi. Sesuatu seperti ini

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

atau bahkan mungkin

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

1
Tidak ada yang akan dikompilasi: Anda harus menginisialisasi variabel sebelum digunakan.
unbeli

@unbeli yah, saya tidak berlatih dalam kompilasi kode manual :) Saya hanya ingin memberikan ide.
Nikita Rybak

3
@unbeli: Hanya untuk memperjelas: currentIndex perlu diinisialisasi. Hal pertama yang Nikita lakukan adalah "currentIndex ++", yang secara alami memunculkan pertanyaan, kenaikan apa? saat ini baik-baik saja karena penggunaan pertama adalah mengaturnya ke pertama.
Jay

Biasanya untuk lebih baik menulis inkrementasi dalam perulangan for, seseorang harus menggunakan ++ var sebagai notasi var ++ yang diperlukan dari kompiler untuk menduplikasi konten var sebelum menaikkannya untuk mengembalikannya sebagai hasil ekspresi meskipun tidak ada yang menginginkannya. Tentu saja, compiler akan mengoptimalkannya tetapi ini seperti membuang sampah di jalan menunggu orang lain untuk membersihkannya.
Chucky

5

Variabel yang dideklarasikan dalam blok inisialisasi harus berjenis sama

kita tidak dapat menginisialisasi tipe data yang berbeda di loop for sesuai desain mereka. Saya hanya memberikan contoh kecil.

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.