Voici ce que j'ai
char[] charArray = new char[] {'h','e','l','l','o'};
Je veux écrire quelque chose à l'effet de:
if(!charArray contains 'q'){
break;
}
Je réalise que .contains () ne peut pas être utilisé ici. J'utilise simplement "contient" pour illustrer ce que j'essaie de faire.
Le test d'extraits suivant pour la condition "ne contient pas", comme illustré dans l'exemple de pseudocode de la question. Pour une solution directe avec boucle explicite, procédez comme suit:
boolean contains = false;
for (char c : charArray) {
if (c == 'q') {
contains = true;
break;
}
}
if (!contains) {
// do something
}
Une autre alternative, utilisant le fait que String
fournit une méthode contains()
:
if (!(new String(charArray).contains("q"))) {
// do something
}
Encore une autre option, cette fois en utilisant indexOf()
:
if (new String(charArray).indexOf('q') == -1) {
// do something
}
Voici une variante de la première version d'Oscar qui n'utilise pas de boucle for-each.
for (int i = 0; i < charArray.length; i++) {
if (charArray[i] == 'q') {
// do something
break;
}
}
Vous pouvez avoir une variable booléenne dont la valeur est false avant la boucle, puis demandez à "faire quelque chose" de définir la variable sur true, que vous pourrez tester après la boucle. La boucle peut également être encapsulée dans un appel de fonction, puis utilisez simplement 'return true' au lieu de la pause et ajoutez une instruction 'return false' après la boucle for.
Cette méthode fait l'affaire.
boolean contains(char c, char[] array) {
for (char x : array) {
if (x == c) {
return true;
}
}
return false;
}
Exemple d'utilisation:
class Main {
static boolean contains(char c, char[] array) {
for (char x : array) {
if (x == c) {
return true;
}
}
return false;
}
public static void main(String[] a) {
char[] charArray = new char[] {'h','e','l','l','o'};
if (!contains('q', charArray)) {
// Do something...
System.out.println("Hello world!");
}
}
}
Manière alternative:
if (!String.valueOf(charArray).contains("q")) {
// do something...
}
Vous pouvez parcourir le tableau ou le convertir en String
et utiliser indexOf
.
if (new String(charArray).indexOf('q') < 0) {
break;
}
Créer une nouvelle String
est un peu inutile, mais c'est probablement le code le plus court. Vous pouvez également écrire une méthode pour imiter l’effet sans entraîner de surcharge.
Quelques autres options si vous ne voulez pas votre propre classe "Utils":
Utilisez Apache commons lang ( ArrayUtils ):
@Test
public void arrayCommonLang(){
char[] test = {'h', 'e', 'l', 'l', 'o'};
Assert.assertTrue(ArrayUtils.contains(test, 'o'));
Assert.assertFalse(ArrayUtils.contains(test, 'p'));
}
Ou utilisez la commande intégrée Arrays :
@Test
public void arrayTest(){
char[] test = {'h', 'e', 'l', 'l', 'o'};
Assert.assertTrue(Arrays.binarySearch(test, 'o') >= 0);
Assert.assertTrue(Arrays.binarySearch(test, 'p') < 0);
}
Ou utilisez la classe Chars de Google Guava:
@Test
public void testGuava(){
char[] test = {'h', 'e', 'l', 'l', 'o'};
Assert.assertTrue(Chars.contains(test, 'o'));
Assert.assertFalse(Chars.contains(test, 'p'));
}
Légèrement hors sujet, la classe Chars permet de trouver un sous-tableau dans un tableau.
De NumberKeyListener source code . Cette méthode est utilisée pour vérifier si char est contenu dans un tableau défini de caractères acceptés:
protected static boolean ok(char[] accept, char c) {
for (int i = accept.length - 1; i >= 0; i--) {
if (accept[i] == c) {
return true;
}
}
return false;
}
C'est similaire à la solution @ ÓscarLópez. Peut-être une cause un peu plus rapide d'absence d'itérateur foreach.