ArrayList'te öğe dizinini bulmanın daha iyi bir yolu var mı?


91

Bir Android uygulaması için aşağıdaki işlevselliğe sahibim

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

Bir elemanın konumunu elde etmek için bir fonksiyon yazmanın "en iyi" yolu bu mu? Yoksa javada kullanmam gereken süslü, utangaç bir yerel işlev var mı?


2
Bu kod muhtemelen kusurludur: kullanımı ==çoğu durumda yanlış sonuçlar verecektir.

3
Unutmayın, dizeleri '==' ile karşılaştıramazsınız, String.equals (String str) kullanmanız gerekir
MrZander

5
@MrZander Elbette bunları karşılaştırabilirsiniz ==... bu doğru bir karşılaştırma değil ;-)

Hala Java'da yeniyim diyebilirsiniz .. String.equalsDaha ===çok JavaScript gibi bir dilde a olabilir mi? Örneğin. değer VE türüne karşı kontroller?
Jacksonkr

3
Hayır == , nesne kimliğidir ve "aynı nesnedir" anlamına gelir . (Bu görünüm, 42 veya char 'x' değerine sahip yalnızca bir sayı olduğunu düşünürseniz, referans türleri kadar ilkel değerler için de geçerlidir). Object.equalsa, sanal yöntem tüm nesne örnekleri için tanımlandığı gibidir ve bu demektir "aynı değere sahip" tüm sınıf tipi nesne uzanan ve tüm için kullanılması gereken şekilde, nesne eşitlik testleri. Kapak ==vs'de birçok soru var Object.equalsve bu anlaşılması çok önemli bir kavram! Örneğin, bu yanlıştır: "hello" == new String("hello")! Doh!

Yanıtlar:


195

ArrayListbir indexOf()yöntemi var . Daha fazlası için API'yi kontrol edin, ancak şu şekilde çalışır:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() hızlı bir şekilde yönteminizin döndürdüğü şeyi tam olarak döndürecektir.


3
Karmaşıklık açısından gönderilen koddan daha "hızlı" değildir, ancak daha verimli bir şekilde uygulanabilir. Ayrıca, indexOf burada biraz farklı tepki verecektir: ==indexOf kullanırken orijinal kod [yanlış şekilde] kullanır equals().

Aslında, hemen hemen aynı koddur (en azından sahip olduğum Sun Java 6 kodunda), ancak ayrı ayrı null işleyen bir if-else dalı ile başlatmaları dışında.
yshavit

Kablolu eski diziler ve List <> FindIndex () yöntemine sahiptir, ancak ArrayList için ortada API değişir: D
boctulus

16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

Çıktı: Liste Dizini: 7

Eğer başarılı olursa , H onu dönecektir 7 Eğer başarılı olursa, J onu dönecektir -1 biz varsayılan değer tanımlandığı gibi 1.

Bitti


İ bunun tersi bu hale nasıl, sizin çözüm için girdidir H ve pozisyonu almak H benim girdi Endeks ise, varsayalım 7 ben bu dizinin dize değerini nasıl alabilirim. Teşekkürler
Jimale Abdi

1
@JimaleAbdi ArrayList.get (7) yapın. Konumun 7.
Hiren Patel

6

Senin Eğer Listis sıralanmış ve (iyi rasgele erişim vardır ArrayListyapar), sen de bakması gerektiğini Collections.binarySearch. Aksi takdirde, List.indexOfbaşkalarının da belirttiği gibi kullanmalısınız .

Ancak algoritmanız sağlam, fwiw ( ==diğerlerinin işaret ettiği dışında).


3

Gerçekten de javada kullanmanız gereken süslü, utangaç bir yerel işlev var.

ArrayList,

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

Bunu şu şekilde çağırabilirsiniz _categories:

_categories.indexOf("camels")

Android için programlama konusunda deneyimim yok - ancak bu standart bir Java uygulaması için işe yarar.

İyi şanslar.


1
yerel işlev bana C \ C ++ anlamına geliyor .. Sadece söyleyerek.
Hunter McMillen

3

Java API, kullanabileceğiniz iki yöntemi belirtir: indexOf(Object obj)ve lastIndexOf(Object obj). İlki, bulunursa elemanın dizinini, aksi takdirde -1 değerini döndürür. İkincisi, listeyi geriye doğru aramak gibi olan son dizini döndürür.


1

Listedeki öğenin konumunu bulmanın en iyi yolu Koleksiyonlar arayüzünü kullanmaktır.

Örneğin,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Çıktı: 2


1

Koleksiyondaki öğenin ilk oluşumunu bulmak için indexOf () yöntemini kullanın.


0

buradaki en iyi çözüm

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
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.