web-dev-qa-db-fra.com

Comment puis-je vérifier si un seul caractère apparaît dans une chaîne?

Dans Java, existe-t-il un moyen de vérifier la condition:

"Ce caractère unique apparaît-il dans la chaîne x"

sans utiliser une boucle?

181
barfoon

Vous pouvez utiliser string.indexOf('a') .

Si le 'a' est présent dans string, il renvoie l'index (> = 0). Sinon, il retourne -1. Ainsi, une valeur de retour non négative signifie que 'a' is present in the string.

248
mP.
  • String.contains() qui vérifie si la chaîne contient une séquence spécifiée de valeurs de caractère
  • String.indexOf() qui renvoie l'index dans la chaîne de la première occurrence du caractère ou de la sous-chaîne spécifiés (il existe 4 variantes de cette méthode)
134
Zach Scrivena

Je ne suis pas sûr de ce que l'affiche originale demande exactement. Puisque indexOf (...) et contient (...) les deux probablement utilisent des boucles en interne, peut-être cherche-t-il à voir si cela est possible sans boucle? Je peux penser à deux manières, l'une serait bien sûr récurrente:

public boolean containsChar(String s, char search) {
    if (s.length() == 0)
        return false;
    else
        return s.charAt(0) == search || containsChar(s.substring(1), search);
}

L'autre est beaucoup moins élégant, mais complet ...:

/**
 * Works for strings of up to 5 characters
 */
public boolean containsChar(String s, char search) {
    if (s.length() > 5) throw IllegalArgumentException();

    try {
        if (s.charAt(0) == search) return true;
        if (s.charAt(1) == search) return true;
        if (s.charAt(2) == search) return true;
        if (s.charAt(3) == search) return true;
        if (s.charAt(4) == search) return true;
    } catch (IndexOutOfBoundsException e) {
        // this should never happen...
        return false;
    }
    return false;
}

Le nombre de lignes augmente au fur et à mesure que vous devez bien entendu prendre en charge des chaînes de plus en plus longues. Mais il n'y a pas de boucles/récurrences du tout. Vous pouvez même supprimer la vérification de longueur si vous craignez que cette longueur () utilise une boucle.

30
Jack Leow
String temp = "abcdefghi";
if(temp.indexOf("b")!=-1)
{
   System.out.println("there is 'b' in temp string");
}
else
{
   System.out.println("there is no 'b' in temp string");
}
12
Richard

Si vous devez vérifier la même chaîne souvent, vous pouvez calculer les occurrences de caractères à l’avance. Ceci est une implémentation qui utilise un tableau de bits contenu dans un tableau long:

public class FastCharacterInStringChecker implements Serializable {
private static final long serialVersionUID = 1L;

private final long[] l = new long[1024]; // 65536 / 64 = 1024

public FastCharacterInStringChecker(final String string) {
    for (final char c: string.toCharArray()) {
        final int index = c >> 6;
        final int value = c - (index << 6);
        l[index] |= 1L << value;
    }
}

public boolean contains(final char c) {
    final int index = c >> 6; // c / 64
    final int value = c - (index << 6); // c - (index * 64)
    return (l[index] & (1L << value)) != 0;
}}
4
fillumina

Pour vérifier si quelque chose n'existe pas dans une chaîne, vous devez au moins regarder chaque caractère d'une chaîne. Donc, même si vous n'utilisez pas explicitement une boucle, elle aura la même efficacité. Cela étant dit, vous pouvez essayer d'utiliser str.contains ("" + char).

4
mweiss

Vous pouvez utiliser 2 méthodes de la classe String.

  • String.contains() qui vérifie si la chaîne contient une séquence spécifiée de valeurs de caractère
  • String.indexOf() qui renvoie l'index dans la chaîne de la première occurrence du caractère ou de la sous-chaîne spécifié ou renvoie -1 si le caractère n'est pas trouvé (il existe 4 variantes de cette méthode)

Méthode 1:

String myString = "foobar";
if (myString.contains("x") {
    // Do something.
}

Méthode 2:

String myString = "foobar";
if (myString.indexOf("x") >= 0 {
    // Do something.
}

Liens par: Zach Scrivena

3
Halfacht

Oui, en utilisant la méthode indexOf () sur la classe string. Voir la documentation de l'API pour cette méthode

2
Mystic
package com;
public class _index {

    public static void main(String[] args) {
        String s1="be proud to be an indian";
        char ch=s1.charAt(s1.indexOf('e'));
        int count = 0; 
        for(int i=0;i<s1.length();i++) {
            if(s1.charAt(i)=='e'){
                System.out.println("number of E:=="+ch);
                count++;
            }
        }
        System.out.println("Total count of E:=="+count);
    }
}
1
Praveen kumar

Est-ce que le dessous de ce que vous cherchiez?

int index = string.indexOf(character);
return index != -1 && string.lastIndexOf(character) != index;
0
Toochka
String s="praveen";
boolean p=s.contains("s");
if(p)
    System.out.println("string contains the char 's'");
else
    System.out.println("string does not contains the char 's'");

Sortie

string does not contains the char 's'
0
praveen
static String removeOccurences(String a, String b)
{
    StringBuilder s2 = new StringBuilder(a);

    for(int i=0;i<b.length();i++){
        char ch = b.charAt(i);  
        System.out.println(ch+"  first index"+a.indexOf(ch));

        int lastind = a.lastIndexOf(ch);

    for(int k=new String(s2).indexOf(ch);k > 0;k=new String(s2).indexOf(ch)){
            if(s2.charAt(k) == ch){
                s2.deleteCharAt(k);
        System.out.println("val of s2 :             "+s2.toString());
            }
        }
      }

    System.out.println(s1.toString());

    return (s1.toString());
}
0
Ganeshmani

Vous ne pourrez pas vérifier si char apparaît dans une chaîne sans au moins la parcourir une fois en utilisant boucle/récursivité (les méthodes intégrées comme indexOf utilisent également une boucle).

Si le non. de fois où vous regardez si un caractère est dans une chaîne x est beaucoup plus long que la longueur de la chaîne que je ne recommanderais d'utiliser une structure de données Set car cela serait plus efficace que de simplement utiliser indexOf

String s = "abc";

// Build a set so we can check if character exists in constant time O(1)
Set<Character> set = new HashSet<>();
int len = s.length();
for(int i = 0; i < len; i++) set.add(s.charAt(i));

// Now we can check without the need of a loop
// contains method of set doesn't use a loop unlike string's contains method
set.contains('a') // true
set.contains('z') // false

En utilisant set, vous pourrez vérifier si un caractère existe dans une chaîne en temps constant O(1) mais vous utiliserez également mémoire supplémentaire (la complexité de l'espace sera O(n)).

0
Dhyey
you can use this code. It will check the char is present or not. If it is present then the return value is >= 0 otherwise it's -1. Here I am printing alphabets that is not present in the input.

import Java.util.Scanner;

public class Test {

public static void letters()
{
    System.out.println("Enter input char");
    Scanner sc = new Scanner(System.in);
    String input = sc.next();
    System.out.println("Output : ");
    for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) {
            if(input.toUpperCase().indexOf(alphabet) < 0) 
                System.out.print(alphabet + " ");
    }
}
public static void main(String[] args) {
    letters();
}

}

//Ouput Example
Enter input char
nandu
Output : 
B C E F G H I J K L M O P Q R S T V W X Y Z
0
Nandu cg