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.
3 Réponses :
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
}
D'après vos commentaires, je suppose que vos exigences sont les suivantes:
| , par exemple "a|e|b|c|a|c|a|d" "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( "|" ) );
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);
}
}
Exactement deux ou au moins deux fois?
bonne question: au moins deux fois
Eh bien, vous pouvez utiliser
PatternetMatcherpour 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èmeaseulement ou le deuxièmecé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
LinkedHashSetet reconstruisez la chaîne à partir de cela. L'ordre des éléments serait préservé et les doublons seraient ignorés.