0
votes

Supprimer les mots dupliqués à partir d'une chaîne

J'ai une corde comme:

Bonjour comment comment vas-tu?

J'aime les cookies cookies, pommes et crêpes.

Je souhaite une sortie:

bonjour comment allez-vous?

J'aime les cookies, les pommes et les crêpes.

Jusqu'à présent, j'ai codé: xxx

i obtenir des sorties comme:

Bonjour comment allez-vous vous?

J'aime les cookies cookies, pommes et crêpes.

J'ai besoin d'aide avec la logique pour ,. ! ? . ..


7 commentaires

@Jbnizet je trouve votre commentaire impoli, l'auteur de la poste a déclaré qu'il a besoin d'aide avec la logique, ce qui signifie qu'il sait déjà qu'ils ne sont pas les mêmes, et comme il sait déjà que cela donne des problèmes, ce qui le suggère de déboguer ne va pas résoudre le problème


@Jbnizet oui je sais cookies n'est pas égal à cookies, . J'ai besoin d'aider avec la logique afin que mon programme le prenne comme la même et ajoute celui avec la ponctuation


Duplicailler possible de Comment puis-je éliminer les mots en double de la chaîne dans Java?


Ce dont vous avez besoin est appelé Tobenisation < / i>.


@ TIIJ7, il y avait une mauvaise utilisation de la mise en forme - un style de citation de code pour la citation de texte.


@Mikeb. Alors, qu'est-ce qui a de mauvais formatage pour faire avec les modifications du texte de sortie réel? Vous venez de télécharger le mot "crêpes", faisant de la modification de la sortie attendue et d'invalider la réponse affichée


@Ferrybig, oui, c'était ma faute pendant le formatage du texte. Maintenant tout est corrigé.


3 Réponses :


4
votes

Vous pouvez utiliser regex pour le faire pour vous. Exemple de code: xxx

  1. \ b correspond à une position de la limite de mot entre un caractère de texte et un caractère ou une position sans mot (démarrage / fin de la chaîne).
  2. \ w correspond à n'importe quel caractère de mot (alphanumérique et soussecore).
  3. \ b correspond à une position de la limite de mot entre un caractère de texte et un caractère ou une position sans mot (démarrage / fin de la chaîne).
  4. \ s correspond à n'importe quel caractère blancheur (espaces, onglets, pauses de ligne).
  5. * correspondre 0 ou plus du jeton précédent.
  6. (? = correspond à un groupe après l'expression principale sans l'inclure dans le résultat.
  7. . correspond à n'importe quel caractère, à l'exception des pauses de la ligne.
  8. \ 1 correspond aux résultats du groupe de capture n ° 1 à l'étape 2.

    Remarque: il est important d'utiliser des limites de mots ici pour éviter de faire correspondre des mots partiels correspondants.

    Voici un lien vers la démonstration et l'explication de regex: Regexdemo


4 commentaires

pouvez-vous s'il vous plaît expliquer la regex pls


Qu'est-ce que nous sommes censés comprendre cela?


J'ai ajouté un lien vers la démo et l'explication que vous pouvez le modifier là-bas pour voir et comparer les résultats


Pourrait vouloir noter que, comme actuellement écrit, cela ne fonctionnera pas si les contractions sont autorisées dans l'entrée. Une entrée de impossible de ne pas entraînera un 'ne peut pas



2
votes

Vous devez utiliser une variable secondaire pour stocker vos mots sans la ponctuation.

String[] s = input.split(" ");
String ans = "";

for (int i = 0; i < s.length - 1; i++) {

    String currentAux = s[i].replaceAll("[,.!?]", "");
    String nextAux = s[i + 1].replaceAll("[,.!?]", "");

    if (nextAux.equals(currentAux)) {
        continue;
    }

    ans += " " + s[i];
}

ans += " " + s[s.length - 1];

System.out.println(ans);


4 commentaires

Pour "Bonjour comment comment vas-tu?" Il renvoie Bonjour comment allez-vous . ? manque


@Sandeepranjan l'essayer à nouveau maintenant :)


C'est une bonne réponse, mais je pense que vous devriez ajouter du côlon et du point-virgule dans vos appels à de remplacement parce que des phrases telles que "J'ai eu un grand repas de repas; Cependant, j'ai déjà faim de nouveau. " ne sera pas traité correctement - repas apparaîtra deux fois.


@ D.B. Nous ajoutons beaucoup de symboles, ceux que j'ai utilisés sont ceux demandés à la fin de la question.



2
votes

Vous pouvez utiliser java.util.stringtenzerzer code> pour jeton de la gage des mots. Assurez-vous de définir les délimiteurs pour diviser les mots. Dans votre cas, ce sont des espaces, des virgules et des arrêts complets. Cela peut vous aider à scinder les mots sans les marques de ponctuation. Ensuite, vous pouvez comparer le jeton précédent avec le courant et s'ils sont égaux, vous pouvez l'ignorer.

Vous pouvez essayer ce code SNIPPET: P>

String s = "I love cookies cookies, apples and pancakes pancakes.";

StringTokenizer tokenizer = new StringTokenizer(s, " ,.", true);

List<String> duplicateRemovedTokenList = new LinkedList<>();

String prevToken = null;

while (tokenizer.hasMoreTokens()) {

    String currentToken = tokenizer.nextToken();

    if (currentToken.equals(" ")) {
        duplicateRemovedTokenList.add(currentToken);
        continue;
    }

    if (!currentToken.equals(prevToken)) {
        duplicateRemovedTokenList.add(currentToken);
        prevToken = currentToken;
    }
}

String duplicateRemovedString = StringUtils.join(duplicateRemovedTokenList, "");


1 commentaires

Cela a quelques problèmes, il ajoute des espaces supplémentaires et ne fonctionne pas avec des entrées telles que "J'aime les biscuits, les biscuits, les pancakes des pommes et des crêpes." (Notez la virgule supplémentaire après le premier cookies .