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
?
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
?
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).
Vous pouvez utiliser ArrayUtils.contient de Apache Commons Lang
public static boolean contains(Object[] tableau, Objet objectToFind)
String[] fieldsToInclude = { "id", "name", "location" };
if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
// Do some stuff.
}
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;
}
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 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.