Cara yang lebih baik untuk menemukan indeks item di ArrayList?

89

Untuk aplikasi Android, saya memiliki fungsi berikut

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;
}

Apakah itu cara "terbaik" untuk menulis fungsi untuk mendapatkan posisi elemen? Atau apakah ada fungsi asli shmancy mewah di java yang harus saya manfaatkan?

Jacksonkr
sumber
2
Kode ini kemungkinan besar cacat: penggunaan dari ==akan menghasilkan hasil yang salah dalam banyak kasus.
3
Ingat, Anda tidak dapat membandingkan string dengan '==', Anda harus menggunakan String.equals (String str)
MrZander
5
@MrZander Tentu Anda dapat membandingkannya dengan ==... itu bukan perbandingan yang tepat ;-)
Anda dapat mengetahui bahwa saya masih baru mengenal Java .. String.equalslebih seperti apa yang ===mungkin ada dalam bahasa seperti JavaScript? misalnya. memeriksa nilai DAN jenis?
Jacksonkr
3
Tidak. == Adalah identitas objek dan artinya "adalah objek yang sama" . (Tampilan ini berlaku untuk nilai primitif serta jenis referensi, jika Anda menganggap hanya ada satu angka dengan nilai 42 atau char 'x', dll). Object.equalsadalah metode virtual yang didefinisikan untuk semua instance objek dan itu berarti "memiliki nilai yang sama" , karena semua jenis kelas memperluas Object, dan harus digunakan untuk semua pengujian persamaan objek . Ada banyak pertanyaan di sampul ==vs Object.equalsdan ini adalah konsep yang sangat penting untuk dipahami! Sebagai contoh, ini adalah palsu: "hello" == new String("hello")! Doh!

Jawaban:

192

ArrayListmemiliki indexOf()metode . Periksa API untuk mengetahui lebih lanjut, tetapi begini cara kerjanya:

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

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

indexOf() akan mengembalikan persis seperti yang dikembalikan metode Anda, dengan cepat.

Jon Egeland
sumber
3
Tidak ada yang "cepat" dalam hal kerumitan daripada kode yang diposting, meskipun mungkin diterapkan lebih efisien. Juga, indexOf akan bereaksi sedikit berbeda di sini: kode asli [salah] digunakan ==saat indexOf menggunakan equals().
Nyatanya, kode itu hampir sama persis (setidaknya dalam kode Sun Java 6 yang saya miliki), kecuali bahwa mereka memulainya dengan cabang if-else yang menangani null secara terpisah.
yshavit
Itu kabel array lama dan Daftar <> memiliki metode FindIndex () tetapi perubahan API di tengah untuk ArrayList: 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);
}

Output: Indeks Daftar: 7

Jika Anda mengirimkan H maka akan mengembalikan 7 , jika Anda melewati J akan mengembalikan -1 seperti yang kami tentukan nilai default menjadi -1.

Selesai

Hiren Patel
sumber
Bagaimana saya bisa membuat sebaliknya, untuk solusi Anda masukan Anda adalah H dan Anda mendapatkan posisi H , Misalkan jika masukan saya adalah Indeks 7 bagaimana saya bisa mendapatkan nilai String dari indeks itu. Terima Kasih
Jimale Abdi
1
@JimaleArticle Lakukan yourArayList.get (7). 7 adalah posisi Anda.
Hiren Patel
6

Jika Anda Listdiurutkan dan memiliki akses acak yang baik (seperti ArrayListhalnya), Anda harus memeriksanya Collections.binarySearch. Jika tidak, Anda harus menggunakan List.indexOf, seperti yang ditunjukkan orang lain.

Tapi algoritme Anda bagus, fwiw (selain yang ==ditunjukkan oleh yang lain).

yshavit
sumber
3

Memang ada fungsi asli shmancy mewah di java yang harus Anda manfaatkan.

ArrayList memiliki metode instance yang disebut

indexOf(Object o)

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

Anda dapat mengaktifkannya _categoriessebagai berikut:

_categories.indexOf("camels")

Saya tidak memiliki pengalaman dengan pemrograman untuk Android - tetapi ini akan bekerja untuk aplikasi Java standar.

Semoga berhasil.

rustybeanstalk
sumber
1
fungsi asli menyiratkan C \ C ++ untuk saya..Hanya mengatakan.
Hunter McMillen
3

Java API menetapkan dua metode yang dapat Anda gunakan: indexOf(Object obj)dan lastIndexOf(Object obj). Yang pertama mengembalikan indeks elemen jika ditemukan, -1 sebaliknya. Yang kedua mengembalikan indeks terakhir, itu seperti mencari daftar mundur.

danca
sumber
1

Cara terbaik untuk menemukan posisi item dalam daftar adalah dengan menggunakan antarmuka Koleksi,

Misalnya,

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

Hasil: 2

Pradeesh MP
sumber
1

Gunakan metode indexOf () untuk menemukan kemunculan pertama elemen dalam koleksi.

Vasu Dev Garg
sumber
0

solusi terbaik disini

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)
Fatih Çakıroğlu
sumber