1
votes

Vérifiez si une chaîne contient une autre chaîne deux fois

J'ai une boucle for qui itère à travers un maplist et maintenant je veux vérifier chaque entrée de la maplist si elle contient une certaine chaîne plus d'une fois, puis supprimer toutes les chaînes sauf la première qui se produit mais je n'ai aucune idée de comment pour le faire.

for (Map<String, String> entry : mapList) {
    String line = "";
    for (String key : entry.keySet()) {
        if (StringUtils.containsAny(key, "5799"){
            line += entry.get(key) + "|";
        }
        list1.add(line);
    }
}

Je suis reconnaissant pour chaque idée.


6 commentaires

Exactement deux ou au moins deux fois?


bonne question: au moins deux fois


Eh bien, vous pouvez utiliser Pattern et Matcher pour trouver toutes les correspondances de la chaîne et remplacer toutes sauf la première par la chaîne vide "" .


Une autre question: serait-ce une chaîne certaine uniquement ou une chaîne répétée? Votre question semble indiquer que vous pourriez avoir une entrée comme "a | b | c | a | d | c" - voudriez-vous supprimer le deuxième a seulement ou le deuxième c également? Pour faciliter la compréhension de vos besoins, pourriez-vous donner quelques exemples?


Je voudrais supprimer tous les doublons donc le deuxième c aussi


Eh bien, dans ce cas (et c'est toujours une supposition car je ne suis pas sûr de bien comprendre vos exigences): divisez la chaîne, mettez les éléments dans un LinkedHashSet et reconstruisez la chaîne à partir de cela. L'ordre des éléments serait préservé et les doublons seraient ignorés.


3 Réponses :


2
votes

Pour voir si key contient une chaîne s au moins deux fois, et pour supprimer la deuxième occurrence, utilisez indexOf deux fois, avec la seconde appel commençant la recherche après la première occurrence:

System.out.println(removeDuplicates("mississippi", "ss")); // prints: missiippi
System.out.println(removeDuplicates("mississippi", "i"));  // prints: misssspp
System.out.println(removeDuplicates("mississippi", "s"));  // prints: misiippi
System.out.println(removeDuplicates("mississippi", "ab")); // prints: mississippi

Test

static String removeDuplicates(String key, String s) {
    int idx = key.indexOf(s);
    if (idx == -1)
        return key; // Nothing to remove
    StringBuilder buf = new StringBuilder();
    int prev = 0;
    for (int start = idx + s.length(); (idx = key.indexOf(s, start)) != -1; prev = start = idx + s.length())
        buf.append(key.substring(prev, idx));
    return (prev == 0 ? key : buf.append(key.substring(prev)).toString());
}

UPDATE

Si vous souhaitez supprimer tous les doublons, c'est-à-dire ne laisser que la première occurrence, continuez la recherche. Pour de meilleures performances de construction de la nouvelle chaîne, utilisez StringBuilder .

System.out.println(removeSecond("mississippi", "ss")); // prints: missiippi
System.out.println(removeSecond("mississippi", "i"));  // prints: missssippi
System.out.println(removeSecond("mississippi", "pp")); // prints: mississippi

Test

static String removeSecond(String key, String s) {
    int idxFirst = key.indexOf(s);
    if (idxFirst != -1) {
        int idxSecond = key.indexOf(s, idxFirst + s.length());
        if (idxSecond != -1) {
            return key.substring(0, idxSecond) +
                   key.substring(idxSecond + s.length());
        }
    }
    return key; // Nothing to remove
}


0 commentaires

3
votes

D'après vos commentaires, je suppose que vos exigences sont les suivantes:

  • Vous avez une chaîne qui contient plusieurs parties délimitées par le caractère pipe | , par exemple "a|e|b|c|a|c|a|d"
  • Vous souhaitez supprimer toutes les chaînes répétitives tout en préservant l'ordre des éléments, par exemple vous voulez "a|e|b|c|d"

Pour y parvenir, vous pouvez diviser votre chaîne au niveau du tube, collecter les éléments dans un LinkedHashSet et rejoindre les éléments en utilisant le tube.

Exemple utilisant Java 8:

//The pipe needs to be escaped because split() interprets the input as a regex
Set<String> elements = new LinkedHashSet<>( Arrays.asList( input.split( "\\|" ) ) );
//rejoin using the pipe
String output = elements.stream().collect( Collectors.joining( "|" ) );


0 commentaires

1
votes

Si vous souhaitez supprimer toutes les occurrences sauf la première:

public static String removeExceptFirst(String master, String child) throws Exception {
    int firstIndex = master.indexOf(child);
    int lastIndexOf = master.lastIndexOf(child);
    if (firstIndex == lastIndexOf) {
        if (firstIndex == -1) {
            throw new Exception("No occurrence!");
        } else {
            throw new Exception("Only one occurrence!");
        }
    }

    while (true) {
        firstIndex = master.indexOf(child);
        lastIndexOf = master.lastIndexOf(child);
        if (firstIndex == lastIndexOf) {
            return master;
        }
        master = master.substring(0, lastIndexOf) + master.substring(child.length() + lastIndexOf);
    }
}


0 commentaires