Un modo migliore per trovare l'indice di un elemento in ArrayList?


89

Per un'app Android, ho le seguenti funzionalità

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

È questo il modo "migliore" per scrivere una funzione per ottenere la posizione di un elemento? O c'è una fantastica funzione nativa shmancy in java che dovrei sfruttare?


2
Questo codice è probabilmente difettoso: l'uso di ==produrrà risultati errati nella maggior parte dei casi.

3
Ricorda, non puoi confrontare le stringhe con '==', devi usare String.equals (String str)
MrZander

5
@MrZander Certo che puoi confrontarli con ==... semplicemente non è il giusto tipo di confronto ;-)

Puoi dire che sono ancora nuovo in Java .. è String.equalspiù simile a quello che ===potrebbe essere in un linguaggio come JavaScript? per esempio. controlla il valore E il tipo?
Jacksonkr

3
No. == è l' identità dell'oggetto e significa "è lo stesso oggetto" . (Questa vista vale per i valori primitivi e per i tipi di riferimento, se si considera che esiste un solo numero con il valore 42 o il carattere "x", ecc.). Object.equalsè un metodo virtuale definito per tutte le istanze di oggetti e significa "ha lo stesso valore" , poiché tutti i tipi di classe estendono Object e dovrebbero essere usati per tutti i test di uguaglianza degli oggetti . Ci sono molte domande in copertina ==vs Object.equalse questo è un concetto molto importante da capire! Ad esempio, questo è falso "hello" == new String("hello"):! Doh!

Risposte:


192

ArrayListha un indexOf()metodo . Controlla l'API per ulteriori informazioni, ma ecco come funziona:

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

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

indexOf() restituirà esattamente ciò che restituisce il tuo metodo, velocemente.


3
Non è "veloce" in termini di complessità rispetto al codice pubblicato, sebbene possa essere implementato in modo più efficiente. Inoltre, indexOf reagirà in modo leggermente diverso qui: il codice originale [erroneamente] usa ==mentre indexOf usa equals().

In effetti, è quasi esattamente lo stesso codice (almeno nel codice Sun Java 6 che ho), tranne per il fatto che lo avviano con un ramo if-else che gestisce null separatamente.
yshavit

È cablato vecchi array e List <> ha il metodo FindIndex () ma l'API cambia nel mezzo per 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: Indice elenco: 7

Se passi H restituirà 7 , se passi J restituirà -1 come abbiamo definito il valore predefinito -1.

Fatto


Come posso fare il contrario di questo, per la tua soluzione il tuo input è H e ottieni la posizione di H , Supponi se il mio input è l'indice di 7 come posso ottenere il valore String di quell'indice. Grazie
Jimale Abdi

1
@JimaleAbdi Fai yourArrayList.get (7). 7 è la tua posizione.
Hiren Patel

6

Se il tuo Listè ordinato e ha un buon accesso casuale (come ArrayListfa), dovresti esaminare Collections.binarySearch. Altrimenti, dovresti usare List.indexOf, come altri hanno sottolineato.

Ma il tuo algoritmo è valido, fwiw (a parte gli ==altri hanno sottolineato).


3

C'è davvero una fantastica funzione nativa shmancy in java che dovresti sfruttare.

ArrayList ha un metodo di istanza chiamato

indexOf(Object o)

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

Potresti chiamarlo _categoriescome segue:

_categories.indexOf("camels")

Non ho esperienza con la programmazione per Android, ma funzionerebbe per un'applicazione Java standard.

In bocca al lupo.


1
la funzione nativa implica C \ C ++ per me ... solo per dire.
Hunter McMillen

3

L'API Java specifica due metodi che potresti utilizzare: indexOf(Object obj)e lastIndexOf(Object obj). Il primo restituisce l'indice dell'elemento se trovato, -1 altrimenti. Il secondo restituisce l'ultimo indice, che sarebbe come cercare l'elenco all'indietro.


1

Il modo migliore per trovare la posizione di un elemento nell'elenco è utilizzare l'interfaccia Raccolte,

Per esempio,

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

Uscita: 2


1

Usa il metodo indexOf () per trovare la prima occorrenza dell'elemento nella raccolta.


0

la migliore soluzione qui

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.