Pertanyaan Bagaimana cara kerja pernyataan ditingkatkan untuk berangkai, dan bagaimana cara mendapatkan iterator untuk sebuah array?


Diberikan potongan kode berikut:

int[] arr = {1, 2, 3};
for (int i : arr)
    System.out.println(i);

Saya memiliki pertanyaan-pertanyaan berikut:

  1. Bagaimana cara kerja masing-masing loop di atas?
  2. Bagaimana cara mendapatkan iterator untuk sebuah array di Java?
  3. Apakah larik dikonversi ke daftar untuk mendapatkan iterator?

75
2017-10-12 08:25


asal


Jawaban:


Jika Anda menginginkan sebuah Iterator lebih dari satu larik, Anda bisa menggunakan salah satu implementasi langsung di luar sana daripada membungkus larik dalam a List. Sebagai contoh:

Koleksi Apache Commons ArrayIterator

Atau, yang ini, jika Anda ingin menggunakan obat generik:

com.Ostermiller.util.ArrayIterator

Perhatikan bahwa jika Anda ingin memiliki Iterator lebih dari tipe primitif, Anda tidak bisa, karena tipe primitif tidak bisa menjadi parameter generik. Misalnya, jika Anda menginginkan sebuah Iterator<int>, Anda harus menggunakan Iterator<Integer> sebagai gantinya, yang akan menghasilkan banyak autoboxing dan -unboxing jika itu didukung oleh int[].


55
2017-10-12 10:57



Tidak, tidak ada konversi. JVM hanya mengulangi array menggunakan indeks di latar belakang.

Kutipan dari Java Ed 2 Efektif., Item 46:

Perhatikan bahwa tidak ada penalti kinerja untuk digunakan   untuk setiap loop, bahkan untuk array. Bahkan, mungkin menawarkan sedikit keunggulan kinerja   lebih dari biasa untuk loop dalam beberapa keadaan, karena menghitung batas   indeks array hanya satu kali.

Jadi Anda tidak bisa mendapatkan Iterator untuk susunan (kecuali tentu saja dengan mengonversinya menjadi a List pertama).


49
2017-10-12 08:28



Arrays.asList (arr) .iterator ();

Atau tulis sendiri, terapkan antarmuka ListIterator ..


33
2017-10-12 08:32



Google Guava LibrarieKoleksi s menyediakan fungsi seperti itu:

Iterator<String> it = Iterators.forArray(array);

Seseorang harus memilih Guava di atas Koleksi Apache (yang tampaknya ditinggalkan).


31
2017-11-15 10:08



Di Java 8:

Arrays.stream(arr).iterator();

14
2018-03-07 17:42



public class ArrayIterator<T> implements Iterator<T> {
  private T array[];
  private int pos = 0;

  public ArrayIterator(T anArray[]) {
    array = anArray;
  }

  public boolean hasNext() {
    return pos < array.length;
  }

  public T next() throws NoSuchElementException {
    if (hasNext())
      return array[pos++];
    else
      throw new NoSuchElementException();
  }

  public void remove() {
    throw new UnsupportedOperationException();
  }
}

10
2017-07-09 09:25



Sebenarnya, Anda tidak bisa mendapatkan iterator dari array primitif, karena Iterator.next () hanya bisa mengembalikan Object. Tetapi melalui keajaiban autoboxing, Anda bisa mendapatkan iterator menggunakan Arrays.asList () metode.

Iterator<Integer> it = Arrays.asList(arr).iterator();


9
2017-10-12 08:36