Comment trouver l'indice d'un élément dans un tableau int?
Comment puis-je trouver un indice d'une certaine valeur dans un tableau Java de type int
?
J'ai essayé d'utiliser Arrays.binarySearch
sur mon tableau non trié, il ne donne parfois la bonne réponse.
- Binaire de recherche ne fonctionnera jamais sur un tableau non-trié.
- Alors pouvez-vous me suggérer quelque chose, comment dois je faire. Parce que si je trier le tableau, je lâche le suivi des index, et j'ai besoin de savoir quel est l'indice de la valeur vient??
- EDIT: j'ai oublié d'ajouter, j'ai besoin de trouver des index de tableau pour les valeurs doubles ainsi.
- Si vous ne voulez pas pour trier le tableau, il suffit d'utiliser une simple boucle for pour trouver la valeur.
- Il est généralement bon de lire la documentation des fonctions de 🙂 De
binarySearch
: "Recherche dans le tableau spécifié de ... pour la valeur spécifiée à l'aide de l'algorithme recherche binaire. Le tableau doit être trié (comme par le sort(long[]) méthode) avant de faire cet appel. Si elle n'est pas triée, les résultats ne sont pas définis. ..." - Double Possible de stackoverflow.com/questions/3384203/...
- Vous avez besoin d'avoir le tableau trié à appliquer binaire de recherche.
Vous devez vous connecter pour publier un commentaire.
Noter que cette solution est thread-safe, car il crée un nouvel objet de type Liste.
Aussi, vous ne voulez pas appeler cela dans une boucle ou quelque chose comme ça puisque vous serait la création d'un nouvel objet à chaque fois
Une autre option si vous utilisez la Goyave Collections est Ints.indexOf
C'est un excellent choix lorsque l'espace, le temps et la réutilisation de code sont à une prime. Il est également très laconique.
Un coup d'oeil à la API et il dit que vous avez pour trier le tableau en premier
Donc:
Si vous ne voulez pas pour trier le tableau:
Arrays.sort
mute à l'entrée et le tableau d'origine sera modifié.Copie de cette méthode dans votre classe
Appeler cette méthode à passer deux perameters Tableau et de la valeur et de stocker sa valeur de retour dans une variable de type entier.
Merci
Vous pouvez convertir en une liste, puis utilisez la méthode indexOf:
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#asList(T...)
http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#indexOf(java.lang.Objet)
Vous avez besoin de trier les valeurs avant de les utiliser binaire de recherche. Sinon, le manuel est d'essayer tous les entiers dans votre onglet.
Une méthode alternative pourrait être d'une carte de tous les index de chaque valeur dans une carte.
et puis la carte.get(valeur) pour obtenir l'indice.
Ce qui concerne,
Stéphane
@pst, merci pour vos commentaires. Pouvez-vous poster une autre méthode alternative ?
found
ici est inutile (et non utilisés) et doit être supprimé. Un +1 pour "le manuel de la méthode de boucle" si (stylistique et des problèmes de mise de côté).Vous pouvez utiliser des techniques modernes de Java pour résoudre ce problème. Veuillez utiliser le code ci-dessous:
Simple:
Vous pouvez marcher à travers la matrice jusqu'à ce que vous trouver l'index que vous cherchez pour, ou de l'utilisation d'un
List
à la place. Notez que vous pouvez transformer la matrice dans une liste avecasList()
.clear
et lanew ArrayList
sont des opérations inutiles. Attribution d'un nouveauArrayList
des copies de l'ensemble de la matrice, ce qui est inutile, parce queArrays.asList
retourne déjà unList
qui a unindexOf
méthode. De compensation de la copie de la liste est inutile, GC va le prendre loin de toute façon.Vous pouvez le faire comme ceci:
}
Ajouté un XOR 🙂
tab.equals(toSearch)
est de comparer un tableau avec un int. Peut-êtretab[i] == toSearch
à la place.while (tab[i] != toSearch) i++;
VSwhile ((tab[i] ^ toSearch) != 0) i++;
.bitSearch
est toujours plus rapide quegetIndexOf
; alors que si j'simplement permuter les appels vers les deux méthodesgetIndexOf
obtient plus rapidement quebitSearch
. Cela démontre clairement que le second est toujours plus rapide pour certaines raisons de la JVM des éléments internes. Vous devriez être en répétant l'expérience de nombreuses fois (probablement des millions), la moyenne des valeurs, en éliminant les valeurs extrêmes et de faire un échauffement qui est très similaire à l'essai.Dans la méthode main à l'aide de boucles:
-le troisième pour la boucle dans mon exemple est la réponse à cette question.
-dans mon exemple j'ai fait un tableau de 20 entiers aléatoires, affecté à une variable le nombre le plus petit, et arrêté de la boucle lorsque l'emplacement de la pile atteint la valeur la plus petite tout en comptant le nombre de boucles.
Code de sorties de tous les nombres et leurs emplacements, et l'emplacement du plus petit numéro de suivi par le plus petit nombre.
Au cas où quelqu'un est toujours à la recherche de la réponse-
Vous pouvez utiliser ArrayUtils.indexOf() de la [Apache Commons Library][1].
Si vous êtes à l'aide de Java 8, vous pouvez également utiliser le Strean API:
[1]: https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#indexOf(int%5B%5D,%20int)
Binaires de recherche: Binaire de recherche peut également être utilisé pour trouver l'indice de l'élément du tableau dans un tableau. Mais la recherche binaire peut être utilisé uniquement si le tableau est trié. Java nous offre une fonction intégrée de fonction qui peuvent être trouvées dans les Tableaux de la bibliothèque de Java qui rreturn l'indice si l'élément est présent, sinon il renvoie -1. La complexité O(log n).
Ci-dessous est la mise en œuvre d'une recherche Binaire.