web-dev-qa-db-fra.com

Où se trouve l'index Array de Java?

Je dois manquer quelque chose de très évident, mais j'ai cherché partout et ne peux pas trouver cette méthode.

160
Jamie

Pour ce faire, vous pouvez utiliser la classe Arrays utility.

Si le tableau n'est pas trié et que n'est pas, un tableau de primitives:

Java.util.Arrays.asList(theArray).indexOf(o)

Si le tableau est primitives et non triées, vous devez utiliser une solution proposée par l'une des autres réponses, telle que Kerem Baydoğan , Andrew McKinlay ou Mishax's . Le code ci-dessus sera compilé même si theArray est primitif (émettant éventuellement un avertissement) mais vous obtiendrez néanmoins des résultats totalement incorrects.

Si le tableau est trié, vous pouvez utiliser une recherche binaire pour améliorer les performances:

Java.util.Arrays.binarySearch(theArray, o)
197
Jeffrey Hantin

Le tableau n'a pas de méthode indexOf().

Peut-être que cette méthode Apache Commons Lang ArrayUtils est ce que vous recherchez

import org.Apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
52
Kerem Baydoğan

Il n'y en a pas. Utilisez un Java.util.List * ou écrivez votre propre indexOf():

public static <T> int indexOf(T needle, T[] haystack)
{
    for (int i=0; i<haystack.length; i++)
    {
        if (haystack[i] != null && haystack[i].equals(needle)
            || needle == null && haystack[i] == null) return i;
    }

    return -1;
}

* vous pouvez en créer un à partir de votre tableau en utilisant Arrays#asList()

18
Matt Ball

Pour les primitives, si vous voulez éviter la boxe, Guava a des aides pour les tableaux primitifs, par ex. Ints.indexOf (tableau int [], int cible)

16
Andrew McKinlay

Contrairement à C # où vous avez la méthode Array.IndexOf , et JavaScript à la méthode indexOf , l'API de Java (les classes Array et Arrays en particulier) ne possède pas cette méthode. 

Cette méthode indexOf (avec son complément lastIndexOf) est définie dans l'interface Java.util.List . Notez que indexOf et lastIndexOf ne sont pas surchargés et prennent uniquement un objet en tant que paramètre.

Si votre tableau est trié, vous avez de la chance car la classe Arrays définit une série de surcharges de la méthode binarySearch qui trouvera l'index de l'élément que vous recherchez avec les meilleures performances possibles (O (log n) à la place. de O (n), ce dernier étant ce que vous pouvez attendre d’une recherche séquentielle effectuée par indexOf). Il y a quatre considérations:

  1. Le tableau doit être trié soit dans l'ordre naturel, soit dans l'ordre d'un comparateur que vous fournissez sous forme d'argument, ou à tout le moins, tous les éléments dont la valeur est "inférieure à" doivent être placés avant cet élément du tableau et tous les éléments sont "plus grand que" la clé doit venir après cet élément du tableau;

  2. Le test que vous effectuez normalement avec indexOf pour déterminer si une clé se trouve dans le tableau (vérifiez si la valeur de retour n'est pas -1) n'est pas validé avec binarySearch. Vous devez vérifier que la valeur renvoyée n’est pas inférieure à zéro, car la valeur renvoyée indique que la clé n’est pas présente, mais l’index auquel on pourrait s’attendre si elle existait;

  3. Si votre tableau contient plusieurs éléments égaux à la clé, ce que vous obtenez de binarySearch est indéfini; c'est différent de indexOf qui retournera la première occurrence et de lastIndexOf qui retournera la dernière occurrence.

  4. Un tableau de booléens peut sembler être trié s'il contient d'abord tous les faux, puis tous les vrais, mais cela ne compte pas. Il n'y a pas de substitution de la méthode binarySearch qui accepte un tableau de booléens et vous devrez faire quelque chose d'intelligent si vous voulez des performances O (log n) lors de la détection du premier vrai dans un tableau, en utilisant par exemple un tableau de Booléens et les constantes Boolean.FALSE et Boolean.TRUE.

Si votre tableau n'est ni trié ni de type primitif, vous pouvez utiliser les méthodes indexOf et lastIndexOf de List en appelant la méthode asList de Java.util.Arrays. Cette méthode renverra un wrapper d'interface AbstractList autour de votre tableau. Cela implique une surcharge minimale, car il ne crée pas de copie du tableau. Comme mentionné précédemment, cette méthode n'est pas surchargée et ne fonctionnera donc que sur des tableaux de types de référence.

Si votre tableau n'est pas trié et que le type du tableau est primitive, vous n'avez aucune chance avec l'API Java. Ecrivez votre propre boucle for, ou votre propre méthode d'utilitaire statique, qui aura certainement des avantages en termes de performances par rapport à l'approche asList qui implique une surcharge d'instanciation d'un objet. Si vous pensez que l'écriture d'une force brute for pour une boucle qui parcourt tous les éléments du tableau n'est pas une solution élégante, acceptez que c'est exactement ce que fait l'API Java lorsque vous appelez indexOf. Vous pouvez faire quelque chose comme ça:

public static int indexOfIntArray(int[] array, int key) {
    int returnvalue = -1;
    for (int i = 0; i < array.length; ++i) {
        if (key == array[i]) {
            returnvalue = i;
            break;
        }
    }
    return returnvalue;
}

Si vous souhaitez éviter d'écrire votre propre méthode ici, envisagez d'utiliser celle d'un framework de développement tel que Guava. Vous y trouverez une implémentation de indexOf et lastIndexOf

12
Mishax

Java ArrayList a une méthode indexOf. Les tableaux Java n'ont pas cette méthode.

10
James

Je ne me souviens pas d'un "indexOf" sur les tableaux autre que le coder pour vous-même ... bien que vous puissiez probablement utiliser l'une des nombreuses méthodes Java.util.Arrays#binarySearch(...) (voir/ Tableaux javadoc ) si votre tableau contient des types primitifs

6
Kellindil

L'interface List a une méthode indexOf () et vous pouvez obtenir une liste de votre tableau avec la méthode asList () de Array. Autre que cela, Array lui-même n'a pas cette méthode. Il possède une méthode binarySearch () pour les tableaux triés.

5
Mike Yockey

Les tableaux eux-mêmes n'ont pas cette méthode. Une liste, cependant, fait: indexOf

4
Igor

Vous pensez probablement à Java.util.ArrayList , pas au tableau.

3
duffymo

Il n'y a pas de fonction indexOf directe dans les tableaux Java.

2
gambo

Jeffrey Hantin la réponse de/est bonne, mais elle a des contraintes, si cela fait ceci ou autre chose à cela ...

Vous pouvez écrire votre propre méthode d’extension et elle fonctionne toujours comme vous le souhaitez.

Lists.indexOf(array, x -> item == x); // compare in the way you want

Et voici votre extension

public final class Lists {
    private Lists() {
    }

    public static <T> int indexOf(T[] array, Predicate<T> predicate) {
        for (int i = 0; i < array.length; i++) {
            if (predicate.test(array[i])) return i;
        }
        return -1;
    }

    public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
        for (int i = 0; i < list.size(); i++) {
            if (predicate.test(list.get(i))) return i;
        }
        return -1;
    }

    public interface Predicate<T> {
        boolean test(T t);
    }
}
0
M.kazem Akhgary