105 votes

Trouver la deuxième occurrence d'une sous-chaîne dans une chaîne en Java

Nous avons une chaîne de caractères, disons, "cestcequecest" et une sous-chaîne, disons, "est". Je dois trouver l'index de 'e' lorsque la sous-chaîne "est" se produit une deuxième fois dans la chaîne d'origine.

String.indexOf("est") renverra 2 dans ce cas. Je veux que la sortie soit 10 dans ce cas.

1voto

Hasnaa Ibraheem Points 677

J'espère ne pas être en retard à la fête.. Voici ma réponse. J'aime utiliser Pattern/Matcher car il utilise regex qui devrait être plus efficace. Pourtant, je pense que cette réponse pourrait être améliorée :

    Matcher matcher = Pattern.compile("is").matcher("Je pense qu'il y a une solution plus intelligente, n'est-ce pas?");
    int numOfOcurrences = 2;
    for(int i = 0; i < numOfOcurrences; i++) matcher.find();
    System.out.println("Index: " + matcher.start());

1voto

Il semble que ce soit une bonne fête... Je participe:

public static int nthIndexOf(String str, String subStr, int count) {
    int ind = -1;
    while(count > 0) {
        ind = str.indexOf(subStr, ind + 1);
        if(ind == -1) return -1;
        count--;
    }
    return ind;
}

1voto

Rahid Zeynalov Points 59

Tout le monde cherche la i-ème occurrence d'une chaîne de caractères

    public class NthOccuranceExample {

    public static void main(String[] args) {
        String str1 = "helloworld good morning good evening good night";
        String str2 = "ing";
        int n = 2;

        int index = nthOccurrence(str1, str2, n);
        System.out.println("index de str2 dans str1 à l'occurrence "+ n +" = "+ index);
    }

    public static int nthOccurrence(String str1, String str2, int n) {

        String tempStr = str1;
        int tempIndex = -1;
        int finalIndex = 0;
        for(int occurrence = 0; occurrence < n ; ++occurrence){
            tempIndex = tempStr.indexOf(str2);
            if(tempIndex==-1){
                finalIndex = 0;
                break;
            }
            tempStr = tempStr.substring(++tempIndex);
            finalIndex+=tempIndex;
        }
        return --finalIndex;
    }
}

1voto

javasenior Points 899

Vous pouvez obtenir n'importe quelle occurrence d'une sous-chaîne dans une chaîne avec une méthode récursive comme ceci sans aucune bibliothèque:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        String word = "insatisfaction";
        String[] temp = new String[word.length()];
        for (char c : word.toCharArray()) {
            int count = (int) Arrays.stream(temp).filter(e -> e != null && e.contains(String.valueOf(c))).count();
            int index = getIndex(word, String.valueOf(c), count);
            System.out.println(c + " " + count + " " + index);
            temp[index] = String.valueOf(c);
        }

        System.out.println("result -> " + Arrays.toString(temp));
    }

    public static int getIndex(String word, String letter, int count) {
        return count == 0 ? word.indexOf(letter) : word.indexOf(letter, getIndex(word, letter, count - 1) + 1);
    }
}

0voto

Pravat Panda Points 400

Je pense qu'une boucle peut être utilisée.

1 - vérifiez si le dernier index de la sous-chaîne n'est pas la fin de la chaîne principale.
2 - prenez une nouvelle sous-chaîne à partir du dernier index de la sous-chaîne jusqu'au dernier index de la chaîne principale et vérifiez si elle contient la chaîne recherchée
3 - répétez les étapes dans une boucle

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