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?
==
donnera des résultats incorrects dans la plupart des cas.==
... ce n'est tout simplement pas le bon type de comparaison ;-)String.equals
plus comme ce que===
pourrait être dans un langage comme JavaScript? par exemple. vérifie par rapport à la valeur ET au type?==
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.equals
est 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==
vsObject.equals
et c'est un concept très important à comprendre! Par exemple, c'est faux"hello" == new String("hello")
:! Doh!Réponses:
ArrayList
a uneindexOf()
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.la source
==
tandis que indexOf utiliseequals()
.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é
la source
Si votre
List
est trié et a un bon accès aléatoire (comme leArrayList
fait), vous devriez examinerCollections.binarySearch
. Sinon, vous devriez utiliserList.indexOf
, comme d'autres l'ont souligné.Mais votre algorithme est sain, fwiw (autre que les
==
autres l'ont souligné).la source
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
_categories
comme 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.
la source
L'API Java spécifie deux méthodes que vous pouvez utiliser:
indexOf(Object obj)
etlastIndexOf(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.la source
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
la source
Utilisez la méthode indexOf () pour rechercher la première occurrence de l'élément dans la collection.
la source
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)
la source