web-dev-qa-db-fra.com

En Java, comment puis-je déterminer si un tableau de caractères contient un caractère particulier?

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. 

12
Aei

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
}
25
Óscar López

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.

3
Ryan

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...
}
3
ceklock

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.

1
Ted Hopp

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.

1
beat

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.

0
arenaq