2665 votes

En Java, comment puis-je tester si un Tableau contient une certaine valeur?

J'ai un String[] avec des valeurs comme ceci:

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

Chaîne de caractères s, est-il un bon moyen de tester si l' VALUES contient s?

3342voto

camickr Points 137095
Arrays.asList(...).contains(...)

438voto

Juste pour effacer le code pour commencer avec. Nous avons (corrigé):

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

C'est une mutable statique qui FindBugs vous dire, c'est très vilain. Il doit être privée:

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(Notez que vous pouvez réellement supprimer l' new String[]; peu.)

Ainsi, la référence des tableaux sont mauvais, et en particulier ici, nous voulons un ensemble:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(Personnes paranoïaques, comme moi, peuvent se sentir plus à l'aise si c'était enveloppé dans Collections.unmodifiableSet - il pourrait même être rendu public.)

"Chaîne de caractères s, est-il un bon moyen de tester si les VALEURS contient s?"

VALUES.contains(s)

O(1).

236voto

Intracer Points 541

Vous pouvez utiliser ArrayUtils.contient de Apache Commons Lang

public static boolean contains(Object[] tableau, Objet objectToFind)

Exemple:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

165voto

icza Points 3857

Je suis surpris que personne n'a suggéré de simplement la mettre en œuvre à la main:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Edit:

L' v != null condition est constante à l'intérieur de la méthode, il renvoie toujours la même valeur booléenne lors de l'appel de méthode. Donc, si l'entrée array est grand, il est plus efficace d'évaluer cette condition qu'une seule fois et on peut utiliser une procédure simplifiée, plus rapide état de l'intérieur de l' for boucle basée sur le résultat. L'amélioration de l' contains() méthode:

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}

75voto

Uri Points 50687

Si le tableau n'est pas trié, vous devrez effectuer une itération sur tout et faire un appel à égale sur chaque.

Si le tableau est trié, vous pouvez faire une recherche binaire, il y en a un dans les Tableaux de la classe.

En règle générale, si vous allez faire beaucoup de membres de chèques, vous pouvez souhaitez stocker le tout dans un Ensemble, et non pas dans un tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X