Meilleur moyen de trouver l'index de l'élément dans ArrayList?

89

Pour une application Android, j'ai la fonctionnalité suivante

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

Est-ce la "meilleure" façon d'écrire une fonction pour obtenir la position d'un élément? Ou y a-t-il une fonction native shmancy sophistiquée en java que je devrais utiliser?

Jacksonkr
la source
2
Ce code est probablement défectueux: l'utilisation de ==donnera des résultats incorrects dans la plupart des cas.
3
N'oubliez pas que vous ne pouvez pas comparer les chaînes avec '==', vous devez utiliser String.equals (String str)
MrZander
5
@MrZander Bien sûr, vous pouvez les comparer avec ==... ce n'est tout simplement pas le bon type de comparaison ;-)
Vous pouvez dire que je suis encore nouveau à Java ... est String.equalsplus comme ce que ===pourrait être dans un langage comme JavaScript? par exemple. vérifie par rapport à la valeur ET au type?
Jacksonkr
3
Non, == c'est l' identité d'objet et cela signifie "est le même objet" . (Cette vue est vraie pour les valeurs primitives ainsi que pour les types de référence, si vous considérez qu'il n'y a qu'un seul nombre avec la valeur 42 ou le caractère «x», etc.). Object.equalsest une méthode virtuelle définie pour toutes les instances d'objet et cela signifie «a la même valeur» , comme tous les types de classe étendent Object, et doit être utilisée pour tous les tests d' égalité d'objet . Il y a beaucoup de questions chez cover ==vs Object.equalset c'est un concept très important à comprendre! Par exemple, c'est faux "hello" == new String("hello"):! Doh!

Réponses:

192

ArrayLista une indexOf()méthode . Consultez l'API pour en savoir plus, mais voici comment cela fonctionne:

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

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

indexOf() retournera exactement ce que votre méthode retourne, rapidement.

Jon Egeland
la source
3
Il n'est pas "rapide" en termes de complexité que le code affiché, bien qu'il puisse être mis en œuvre plus efficacement. De plus, indexOf réagira légèrement différemment ici: le code original utilise [incorrectement] ==tandis que indexOf utilise equals().
En fait, c'est presque exactement le même code (du moins dans le code Sun Java 6 que j'ai), sauf qu'ils le démarrent avec une branche if-else qui gère les null séparément.
yshavit
Ses vieux tableaux câblés et List <> ont la méthode FindIndex () mais l'API change au milieu pour 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);
}

Sortie: Index de liste: 7

Si vous passez H, il retournera 7 , si vous passez J, il renverra -1 comme nous avons défini la valeur par défaut à -1.

Terminé

Hiren Patel
la source
Comment je peux faire l'inverse de ceci, pour votre solution, votre entrée est H et vous obtenez la position de H , Supposons que si mon entrée est l'indice de 7 comment je peux obtenir la valeur String de cet index. Merci
Jimale Abdi
1
@JimaleAbdi Faites votreArrayList.get (7). 7 est votre position.
Hiren Patel
6

Si votre Listest trié et a un bon accès aléatoire (comme le ArrayListfait), vous devriez examiner Collections.binarySearch. Sinon, vous devriez utiliser List.indexOf, comme d'autres l'ont souligné.

Mais votre algorithme est sain, fwiw (autre que les ==autres l'ont souligné).

yshavit
la source
3

Il existe en effet une fonction native shmancy sophistiquée en java que vous devriez exploiter.

ArrayList a une méthode d'instance appelée

indexOf(Object o)

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

Vous pourrez l'appeler _categoriescomme suit:

_categories.indexOf("camels")

Je n'ai aucune expérience de la programmation pour Android - mais cela fonctionnerait pour une application Java standard.

Bonne chance.

haricot rouillé
la source
1
la fonction native implique C \ C ++ pour moi..Juste dire.
Hunter McMillen
3

L'API Java spécifie deux méthodes que vous pouvez utiliser: indexOf(Object obj)et lastIndexOf(Object obj). Le premier renvoie l'index de l'élément s'il est trouvé, -1 sinon. Le second retourne le dernier index, ce serait comme chercher dans la liste en arrière.

danca
la source
1

La meilleure façon de trouver la position de l'élément dans la liste est d'utiliser l'interface Collections,

Par exemple,

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

Sortie: 2

Pradeesh MP
la source
1

Utilisez la méthode indexOf () pour rechercher la première occurrence de l'élément dans la collection.

Vasu Dev Garg
la source
0

la meilleure solution ici

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
la source