java: ArrayList - bir dizin olup olmadığını nasıl kontrol edebilirim?


111

Ben kullanıyorum ArrayList<String>nasıl belirli bir dizin olup olmadığını kontrol edebilir ve ben belirli endeksleri de veri eklemek?

get()Değeri basitçe kontrol etmeli miyim ? Yoksa bir istisna mı beklemeliyim? Başka bir yolu var mı?

Güncelleme

Cevaplarınız için teşekkür ederim, ancak sadece belirli indekslere bir şeyler eklediğim için, listenin uzunluğu hangilerinin müsait olduğunu bana göstermeyecek.


2
Bir Sete bir göz atın, belki ihtiyacınız olan şeye daha uygun?
Paul Whelan

3
O zaman yapmanız get()ve kontrol etmeniz gerekecek null- yine de istisnalara güvenmeyin. BununHashTable yerine
java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html

müthiş !! HashTable teşekkür kullanacağım
ufk

Yanıtlar:


159

Yöntem , listedeki öğelerin sayısını arrayList.size() döndürür - bu nedenle, dizin değerinden büyük veya ona eşitse size()mevcut değildir.

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}

10
size()Sıfır tabanlı bir dizin olduğu için "büyük veya eşit" olmalıdır .
McDowell

1
Ayrıca bu atomik yapmak için listeyi kilitlerken boyut () kontrolü ve karşılık gelen koşullu indeks tabanlı arama yapmanız gerektiğini de belirtmeye değer.
Adamski

3
Lütfen bu yanıtı doğru olarak işaretlememin nedeni sahibinin (Amarghosh) soruma bir yorumda sorumu yanıtlamasıdır. HashTable, ihtiyaçlarımı çok daha iyi karşılayacak.
ufk

dizi listesindeki öğeleri öğenin kimliğiyle ayarlıyorsanız ne olur? ex. mylist.set (1, öğe1); mylist.set (3, öğe3); // atlamak 2 Sanırım HashMap bu senaryo için daha uygun?
yeahman

bu beni pek tatmin etmiyor .. eğer endeks zaten oradaysa listede bir şey yapmak istersem, aksi halde onu hazırlamak için .. yeni bir liste ile başlayacağım index = 0ve benim list.size() == 0de. bu yüzden ilk kontrol ettiğimde doğru olacak ve bir şeyler yapmak için listeyi hazırlayacağım. ama bir dahaki sefere bu dizinde, dizinim hala olacak index = 0ve şimdi, bir şeyler yapmam gerekiyordu, listedeki o öğeyi yeniden başlatıyorum. İlk düşünce, &&ikinci bir koşul için, list.get(index) == nullancak işe yaramıyor, neden böyle sorular var
roberto tomás

69

Listenizin boyutunu kullanma konusunda bir düzine öneri alırken, bu doğrusal girişli listelerde işe yarar, kimse sorunuzu okumadı.

Farklı dizinlere elle giriş eklerseniz, belirli bir dizini kontrol etmeniz gerektiğinden bu önerilerin hiçbiri çalışmayacaktır.

Kullanılması (list.get (indeks) == null) eğer ikisinden biri çalışmayacaktır) (olsun gibi yerine null adlı dönen bir istisna atar.

Bunu dene:

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

İndeks yoksa buraya yeni bir giriş eklenir. Farklı bir şey yapmak için onu değiştirebilirsiniz.


2
Teşekkür ederiz, dizi dizinlerinin var olup olmadığını test etmek için bu tekniğe ihtiyaç duyduk.
Numen

11
try/catchBu tür işler için kullanmaktan kaçınmayı unutmayın , programınızı% 50 veya daha fazla yavaşlatacaktır .. hata kontrolü, mevcut kodunuzu yavaşlatmak için bir kayış gibi ekler .. kritik alanlarda bundan kaçınmak daha iyidir. lengthBu durumda kontrol etmek , yapabileceğiniz en iyi şeydir, çünkü indexher zaman daha az olacaktır length, eskileri indexdeğiştirecek ve indexeğer removeonları kullanırsanız yenileri olacaktır , bu yüzden kontrol eden kural lengthher zaman işe yarayacaktır.
2014

1
@SSpoke ... Kabul etsem de dene / yakala 'iyi' bir cevap olmaktan çok uzak; liste seyrek olduğunda sorunu çözecektir. Önerinin bir dizi kullanmayı tercih ediyorum: Object [] ary; aşağıdaki veya bir karma.
will

12

İhtiyacın olan şey bu ...

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

Neden düz eski bir dizi kullanmıyorsunuz? Bir Listeye endeksli erişim bence bir kod kokusu.


3
Her zaman değil, çünkü ArrayList'in zamanla büyümesini isteyebilir ve bir dizi bunu yapamaz.
Coyote21

7

Genellikle dizinin dizi boyutundan küçük olup olmadığını kontrol ederim

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

Ayrıca indeksin negatif bir değer olduğu konusunda endişeleriniz varsa, aşağıdakileri kullanın

if (index >= 0 && index < list.size()) {
    ...
}

1
Bu , birkaç yıl önce kabul edilen Cevaptan daha fazla nasıl bir değer sağlar ?
Basil Bourque

2
Sanırım sizin görüşünüze göre herhangi bir değer sağlamıyor, ancak roberto tomás'ın kabul edilen cevabı tam olarak anlamadığını varsayarak kabul edilen cevap üzerine bir yorumunu gördüm. kontrol edin "yeni bir listeyle index = 0'dan başlayacağım ve benim de list.size () == 0'dan başlayacağım. Bu yüzden ilk kontrol ettiğimde doğru olacak" Yardım için ayrı bir cevap göndermeye karar verdim gelecekteki herhangi bir karışıklık.
AamirR

6

Güncellemenizle ilgili olarak (muhtemelen başka bir soru olmalıdır). ArrayList yerine bu nesnelerden oluşan bir dizi kullanmalısınız, böylece null değerini kontrol edebilirsiniz:

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

En iyi pratik

Dizinizde yüzlerce giriş yoksa, 3,8 vb. Sihirli sayılardan kurtulmak için bir sınıf olarak düzenlemeyi düşünmelisiniz.

İstisna kullanarak kontrol akışı kötü bir uygulamadır.


1
[8] dizisi yoksa, ArrayIndexOutOfBoundException ile karşılaşırsınız.
Nitesh Kumar Anand


3

Yöntemi ArrayListkullanarak bir boyutunu kontrol edebilirsiniz size(). Bu maksimum endeksi +1 döndürecektir


2

bunu yapmanın basit bir yolu:

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

1

Bir dizinin var olup olmadığının hızlı ve kirli testi. uygulamanızda değiştirme listesi Listeniz ile test ediyorsunuz.

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

veya 2 Boyutlu Dizi Listeleri için ...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}

1
Listede yok ama önemli .lengthdeğil, list.size()her zaman böyle berbat ettim haha ​​bana bu konuda rehberlik etmesi için derleyiciye güveniyorum. Muhtemelen ilkel dizileri düşünüyordunuz
SSpoke

1
Yakaladığınız için teşekkürler. Kapların önemini unutmak kolay olabilir.
t3dodson

0

Dizininiz listenizin boyutundan küçükse, muhtemelen nulldeğeri olan var demektir. Eğer indeks daha büyükse, o indeksi ensureCapacity() kullanabilmek için arayabilirsiniz .

Endeksinizdeki bir değerin olup olmadığını kontrol etmek istiyorsanız null, arayınget()


1
SureCapacity (int) 'nin çağrılması Listenin boyutunu artırmaz, yalnızca kapasiteyi artırır; yani "potansiyel boyut" yani sınırların dışında dizin aramaları yine başarısız olacaktır.
Adamski

Ayrıca, neden sureCapacity (int) çağırılsın? Örneğin listenin mevcut boyutu 5 ise ve #: 100.000.000 numaralı öğenin değerini belirlemek istiyorsanız, bu inanılmaz pahalı bir işlem olabilir.
Adamski

Demek istediğim, size () 'den küçük indisler her zaman var,> = size () olanlar yok ve liste yeterince büyüyene kadar onları (== call set ()) kullanamazlar. SureCapacity'i çağırmak gerçekten yeterli değildir, öğelerin eklenmesi ile boyutu değiştirmek gerekir.
Dmitry

SureCapacity (int) 'in gerçekte ne yaptığı hakkında yanlış açıklama. ArrayList boyutuyla hiçbir şey yapmaz.
Mohsen

0

Dizinin boyutunu kontrol edebilirsiniz.

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'
    }
}
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.