java: ArrayList - bagaimana cara memeriksa apakah ada indeks?

111

Saya menggunakan ArrayList<String>dan saya menambahkan data pada indeks tertentu, bagaimana cara memeriksa apakah ada indeks tertentu?

Haruskah saya sederhana get()dan memeriksa nilainya? Atau haruskah saya menunggu pengecualian? Apakah ada cara lain?

Memperbarui

Terima kasih atas jawaban Anda, tetapi karena saya hanya menambahkan barang pada indeks tertentu, panjang daftar tidak akan menunjukkan mana yang tersedia.

ufk
sumber
2
Coba lihat Set yang mungkin lebih cocok dengan apa yang Anda butuhkan?
Paul Whelan
3
Maka Anda harus get()dan memeriksanya null- jangan mengandalkan pengecualian. Pertimbangkan untuk menggunakan HashTablebukan java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html
Amarghosh
luar biasa !! Saya akan menggunakan terima kasih HashTable
ufk

Jawaban:

159

Metode arrayList.size() mengembalikan jumlah item dalam daftar - jadi jika indeks lebih besar dari atau sama dengan size(), itu tidak ada.

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}
Amarghosh
sumber
10
Itu harus "lebih besar atau sama dengan size()" karena ini adalah indeks berbasis nol.
McDowell
1
Juga perlu disebutkan bahwa untuk membuat atom ini Anda mungkin harus melakukan pemeriksaan size () dan pencarian berbasis indeks bersyarat yang sesuai sambil mengunci daftar.
Adamski
3
harap dicatat bahwa saya menandai jawaban ini dengan benar karena pemilik (Amarghosh) sebagai menjawab pertanyaan saya dalam komentar atas pertanyaan saya. HashTable akan menyesuaikan kebutuhan saya dengan lebih baik.
ufk
bagaimana jika Anda menyetel item dalam daftar larik dengan ID item? ex. mylist.set (1, item1); mylist.set (3, item3); // skipping 2 Kurasa HashMap lebih cocok untuk skenario itu?
yeahman
ini tidak cukup memuaskan saya .. jika saya ingin melakukan sesuatu dalam daftar jika indeksnya sudah ada, tetapi sebaliknya untuk mempersiapkannya .. dengan daftar baru saya akan mulai index = 0dan saya list.size() == 0juga. jadi pertama kali saya memeriksanya akan benar & saya akan menyiapkan daftar untuk melakukan sesuatu. tetapi kali berikutnya pada indeks itu, indeks saya akan tetap ada index = 0dan sekarang saya menginisialisasi ulang elemen itu dalam daftar ketika saya seharusnya melakukan sesuatu. Pikiran pertama adalah &&kondisi kedua seperti list.get(index) == nulltetapi yang tidak berfungsi adalah mengapa ada pertanyaan seperti ini
roberto tomás
69

Meskipun Anda mendapat lusinan saran tentang penggunaan ukuran daftar Anda, yang berfungsi untuk daftar dengan entri linier, sepertinya tidak ada yang membaca pertanyaan Anda.

Jika Anda menambahkan entri secara manual pada indeks yang berbeda, tidak satu pun dari saran ini yang akan berfungsi, karena Anda perlu memeriksa indeks tertentu.

Menggunakan if (list.get (index) == null) juga tidak akan berfungsi, karena get () melontarkan pengecualian alih-alih mengembalikan null.

Coba ini:

try {
    list.get( index );
} catch ( IndexOutOfBoundsException e ) {
    list.add( index, new Object() );
}

Di sini entri baru ditambahkan jika indeks tidak ada. Anda dapat mengubahnya untuk melakukan sesuatu yang berbeda.

pli
sumber
2
Terima kasih, membutuhkan teknik ini untuk pengujian unit apakah indeks array ada.
Noumenon
11
Ingatlah untuk menghindari penggunaan try/catchuntuk jenis pekerjaan ini, itu akan memperlambat program Anda hingga 50% atau mungkin lebih .. pengecekan kesalahan menambahkan seperti tali ke kode yang ada untuk memperlambatnya .. lebih baik untuk menghindarinya di area kritis. Memeriksa lengthdalam hal ini adalah hal terbaik yang dapat Anda lakukan, karena indexakan selalu kurang dari length, yang lama indexakan bergeser dan menjadi baru indexjika Anda removemelakukannya, jadi itulah mengapa pemeriksaan aturan untuk lengthselalu akan berhasil.
SSpoke
1
@SSpoke ... Meskipun saya setuju, coba / tangkap jauh dari jawaban 'bagus'; itu akan mengatasi masalah ketika daftar itu jarang. Saya lebih suka saran untuk menggunakan array: Object [] ary; di bawah atau hash.
akan
12

Inilah yang Anda butuhkan ...

public boolean indexExists(final List list, final int index) {
    return index >= 0 && index < list.size();
}

Mengapa tidak menggunakan array lama biasa? Menurut saya, akses yang diindeks ke Daftar adalah bau kode.

Paul McKenzie
sumber
3
Tidak selalu, karena dia mungkin ingin ArrayList tumbuh seiring waktu, dan itu tidak dapat dilakukan oleh array.
Coyote21
7

Biasanya saya hanya memeriksa apakah indeksnya kurang dari ukuran array

if (index < list.size()) {
    ...
}

Jika Anda juga khawatir indeks menjadi nilai negatif, gunakan berikut ini

if (index >= 0 && index < list.size()) {
    ...
}
AamirR
sumber
1
Bagaimana ini memberikan nilai apapun atas Jawaban yang diterima beberapa tahun yang lalu?
Basil Bourque
2
Saya kira dalam pandangan Anda itu tidak memberikan nilai apa pun, tetapi saya melihat komentar roberto tomás tentang jawaban yang diterima, dengan asumsi dia tidak begitu memahami jawaban yang diterima. periksa "dengan daftar baru saya akan mulai di index = 0 dan list.size () == 0 saya juga. jadi pertama kali saya memeriksanya akan benar" Saya memutuskan untuk memposting jawaban terpisah untuk membantu kebingungan di masa depan.
AamirR
6

Mengenai pembaruan Anda (yang mungkin harus menjadi pertanyaan lain). Anda harus menggunakan array dari objek-objek ini sebagai ganti ArrayList, jadi Anda cukup memeriksa nilai untuk null:

Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
   // not available
}
else {
   // do something
}

Praktek terbaik

Jika Anda tidak memiliki ratusan entri dalam array Anda, Anda harus mempertimbangkan untuk mengaturnya sebagai kelas untuk menghilangkan angka ajaib 3,8 dll.

Alur kontrol menggunakan pengecualian adalah praktik yang buruk.

stacker
sumber
1
Jika array [8] tidak ada, Anda akan menemukan ArrayIndexOutOfBoundException.
Nitesh Kumar Anand
4

Karena java-9ada cara standar untuk memeriksa apakah sebuah indeks termasuk dalam array - Objects # checkIndex () :

List<Integer> ints = List.of(1,2,3);
System.out.println(Objects.checkIndex(1,ints.size())); // 1
System.out.println(Objects.checkIndex(10,ints.size())); //IndexOutOfBoundsException
Anton Balaniuc
sumber
of()Metode juga ditambahkan di Java 9 ke Daftar kelas : docs.oracle.com/javase/9/docs/api/java/util/List.html#of--
Orici
3

Anda dapat memeriksa ukuran ArrayListmenggunakan size()metode ini. Ini akan mengembalikan indeks maksimum +1

jwoolard.dll
sumber
2

cara sederhana untuk melakukan ini:

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}
Josué
sumber
1

Tes cepat dan kotor untuk mengetahui apakah indeks ada atau tidak. dalam implementasi Anda, ganti daftar Dengan daftar yang Anda uji.

public boolean hasIndex(int index){
    if(index < list.size())
        return true;
    return false;
}

atau untuk 2Dimensional ArrayLists ...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}
t3dodson.dll
sumber
1
Daftar tidak .lengthmemilikinya list.size()tetapi bukan masalah besar saya mengacau seperti ini sepanjang waktu haha ​​saya mengandalkan kompiler untuk membimbing saya pada yang satu itu. Anda mungkin berpikir tentang array primitif
SSpoke
1
Terima kasih sudah menangkapnya. Kardinalitas wadah dapat dengan mudah dilupakan.
t3dodson
0

Jika indeks Anda kurang dari ukuran daftar Anda, maka daftar itu ada, mungkin dengan nullnilai. Jika indeks lebih besar maka Anda dapat memanggil ensureCapacity() untuk dapat menggunakan indeks itu.

Jika Anda ingin memeriksa apakah suatu nilai pada indeks Anda nullatau tidak, panggilget()

Dmitry
sumber
1
Memanggil sureCapacity (int) tidak akan meningkatkan ukuran List, hanya kapasitasnya; yaitu "ukuran potensial" sehingga pencarian indeks di luar batas masih akan gagal.
Adamski
Juga, mengapa memanggil sureCapacity (int)? Ini bisa menjadi operasi yang sangat mahal jika misalnya ukuran daftar saat ini adalah 5 dan Anda ingin menentukan nilai item #: 100.000.000.
Adamski
Maksud saya, indeks yang kurang dari size () selalu ada, yang> = size () tidak dan tidak dapat digunakan (== call set ()) hingga list menjadi cukup besar. Memanggil sureCapacity memang tidak cukup, seseorang perlu mengubah ukurannya dengan menambahkan elemen.
Dmitry
Penjelasan yang salah tentang apa yang sebenarnya dilakukan sureCapacity (int). Itu tidak melakukan apa pun dengan ukuran ArrayList.
Mohsen
0

Anda dapat memeriksa ukuran array.

package sojava;
import java.util.ArrayList;

public class Main {
    public static Object get(ArrayList list, int index) {
        if (list.size() > index) { return list.get(index); }
        return null;
    }

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(""); list.add(""); list.add("");        
        System.out.println(get(list, 4));
        // prints 'null'
    }
}
miku
sumber