Meilleure façon de trouver l'indice de l'élément à partir de l'ArrayList<CustomObject>
Tout d'abord, s'il vous plaît corrigez-moi Si je me trompe. Je veux trouver l'indice de l'Élément (j'.e Chaîne de valeur) à partir de ArrayList<CustomType>
sans utiliser de Boucle For.
POJO:
id;
name;
Code:
ArrayList<POJO> list = new ArrayList<POJO>;
//Lots of data added to these list...
Maintenant, je veux trouver l'id de nom particulier à partir de la liste de tableaux sans l'aide ci-dessous type de boucle for.
String id = null;
//TODO Auto-generated method stub
for (int i = 0; i < list.size(); i++) {
if("ABCD".equalsIgnoreCase(list.get(i).getName())) {
id = list.get(i).getId();
break;
}
}
Idéalement, je ne veux pas mettre en œuvre Pour la boucle parce que, dans certains cas, j'ai+ de 500 données à l'intérieur de la Liste et de trouver de l'index à l'aide d'une boucle For n'est pas une bonne façon de le faire.
Peut-être que vous devriez utiliser
500 éléments n'est pas beaucoup, les chances sont de cette boucle n'a pas de réel effet sur les performances de votre code (même si c'est inefficace).
Mais je dois penser à l'avenir aussi. Peut-être que c'augmenter jusqu'à des milliers, voire plus. Donc, c'est la préoccupation. BYW merci pour votre aimable réponse.
Map<String, POJO>
avec le String
étant le nom de la place?500 éléments n'est pas beaucoup, les chances sont de cette boucle n'a pas de réel effet sur les performances de votre code (même si c'est inefficace).
Mais je dois penser à l'avenir aussi. Peut-être que c'augmenter jusqu'à des milliers, voire plus. Donc, c'est la préoccupation. BYW merci pour votre aimable réponse.
OriginalL'auteur Scorpion | 2012-11-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
list.indexOf()
, mais pour le faire fonctionner, vous avez besoin de remplacerequals
ethasCode
de votrePOJO
.Par défaut, les deux objets seront considérées comme égales si elles ont la même référence. Vous pouvez remplacer
equals
de travail pour votre cas:Overridding est égal à vous suggère de remplacer
hashCode
. Par exemple:Ce n'est pas l'adresse de l'inefficacité mentionné dans la question, c'est "juste" une autre façon de faire ce que le code en question. Aussi: en fonction de la taille et de l'utilisation de POJO, l'instanciation d'un juste à la recherche pour un, également nommé sur est une mauvaise idée. Aussi: la plupart du temps d'avoir une
equals()
mise en œuvre sur un POJO que ne pas de considérer laid
est une mauvaise idée.Est-il une option à l'aide d'un
java.util.Comparator
à la place?Vous pouvez utiliser le Comparateur de tri et ensuite de faire une recherche binaire.
Idée intéressante. Mais j'aurais encore besoin de surcharges
equals ()
— ce qui n'aide pas, si vous avez besoin de rechercher les différents prédicats. De mauvais je ne peux pas utiliser Java 8 qui semblent avoir cette fonction.OriginalL'auteur
Trouver des élément de cette façon, d'où la complexité serait vous donner le BIG-O (n). Je pense que si vous plan vous donne un meilleur résultat.
HashMap
serait le meilleur choix. - Où la Complexité serait O(1).Si j'ai une Liste de seulement qu'il ne prenne à nouveau BIG-O (n) pour convertir la Liste de la Carte.
la conversion est BIG-O(n) mais à chaque fois que vous effectuez une requête, il est O(1). si vous devez fréquemment requête, il est préférable de se convertir à la carte.
OriginalL'auteur
Si vous avez besoin d'effectuer une recherche sur la chaîne de valeur, vous devez utiliser un
HashMap
au lieu deArrayList
.OriginalL'auteur
Vous pouvez utiliser le
List.indexOf()
- mais vous devez vous assurez-vous également de remplacerPOJO.equals()
- (et dans le cadre de la convention - aussihashCode()
.Note que, néanmoins, le résultat sera
O(n)
- une autre solution pourrait être d'utiliser un tableau trié (POJO[]
) et l'utilisationTableaux.binarySearch()
ou unSet
/Map
.Si vous utilisez un tableau et
binarySearch()
- vous devez vous assurer quePOJO
met également en œuvreComparable<POJO>
Noter que pour les données statiques (votre liste ne change pas souvent/) - bien que les tableaux et les
binarySearch()
est "pire" alorsHashSet
en termes de big-O notations, dans la pratique, il est souvent beaucoup plus rapide, surtout pour les relativement court listes.En termes de big-O de notation, un hachage basé solution offre une
O(1)
moyen d'accès.binarySearch
exige également laList
d'être triés.Yeap, bien sûr - j'ai pensé qu'il était implicitement évident, je vais ajouter une indication explicite.
Est-il une option à l'aide d'un
java.util.Comparator
ou similaire à la place? Donc, on pourrait rechercher différents prédicats.OriginalL'auteur
Merci à tous pour votre aimable et réponse rapide. Mais un merci Spécial à Joachim Sauer. Vous avez absolument raison, 500 éléments n'est pas beaucoup, les chances sont de cette boucle n'a pas de réel effet sur les performances de votre code (même si c'est inefficace). Même je l'ai essayer jusqu'à 5000 éléments et encore il n'y a pas d'impact négatif sur la performance.
Merci à vous tous encore une fois et merci pour votre commentaire Joachim Sauer.
OriginalL'auteur