2017-08-11 4 views
-3

Je voudrais savoir comment supprimer les chaînes dupliquées d'un conteneur, mais ignorer les différences de mots par rapport à la ponctuation finale.Étant donné un tableau de chaînes, comment puis-je supprimer les doublons?

Par exemple donné ces chaînes:

Pourquoi pouvons-nous ici nous ici?

Je voudrais obtenir cette sortie:

Pourquoi avons-nous ici?

+1

[Chaîne Tokenize.] (https://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) – Mahesh

+1

Duplication possible de [Méthode la plus élégante pour diviser une chaîne?] (https: // stackoverflow .com/questions/236129/le plus élégant-façon-de-fendre-une-chaîne) –

+0

@ Leonardo Pouvez-vous me dire comment? – Shubham

Répondre

0

L'algorithme:

  1. en lisant un mot succès, faire:
  2. Si Fin du fichier, quittez.
  3. Si la liste de mots est vide, repoussez le mot.
  4. sinon commencer
    Rechercher la liste de mots pour le mot.
  5. Si le mot n'existe pas, repoussez le mot.
    autre extrémité (étape 4)
  6. fin (en lisant un mot)

Utilisez std::string pour votre mot. Cela vous permet d'effectuer les opérations suivantes:

std::string word; 
while (data_file >> word) 
{ 
} 

Utilisez std::vector pour contenir vos mots (bien que vous pouvez utiliser std::list aussi bien). Le std::vector se développe dynamiquement, donc vous n'avez pas à vous inquiéter de la réaffectation si vous avez choisi la mauvaise taille. Pour ajouter à std::vector, utilisez la méthode push_back.

Pour comparer std::string, utilisez operator==:

std::string new_word; 
std::vector<std::string> word_list; 
//... 
if (word_list[index] == new_word) 
{ 
    continue; 
} 
0

Alors you have said vous savez comment tokenize une chaîne. (Si vous ne passez pas un peu de temps ici: https://stackoverflow.com/a/38595708/2642059) Donc, je vais supposer que l'on nous donne un vector<string> foo qui contient des mots avec une éventuelle ponctuation.

for(auto it = cbegin(foo); it != cend(foo); ++it) { 
    if(none_of(next(it), cend(foo), [&](const auto& i) { 
                 const auto finish = mismatch(cbegin(*it), cend(*it), cbegin(i), cend(i)); 
                 return (finish.first == cend(*it) || !isalnum(*finish.first)) && (finish.second == cend(i) || !isalnum(*finish.second)); 
                 })) { 
     cout << *it << ' '; 
    } 
} 

Live Example

Il convient de noter ici que vous ne nous avez pas donné des règles sur la façon de gérer des mots tels que: « vers le bas », « downvote » et « downvote » Cet algorithme suppose que la 1 st 2 sont égaux. Vous ne nous avez pas non plus donné de règles sur la façon de gérer: "Pourquoi faisons-nous ici, ici?" Cet algorithme renvoie toujours la répétition finale, de sorte que la sortie serait "Pourquoi sommes-nous ici?" Si les présomptions faites par cet algorithme ne vous plaisent pas totalement, laissez moi un commentaire et nous travaillerons à vous familiariser avec ce code pour vous permettre de faire les ajustements dont vous avez besoin.

+0

Je suis juste un débutant.Alors je vais essayer de comprendre le code.Merci pour la réponse. – Shubham

+0

@Shubham Je vous encourage à passer du temps avec cela, car je crois que c'est la meilleure solution pour votre question. J'ai fourni l'exemple en direct que vous pouvez fourchette et essayer différentes choses avec. Faites-moi savoir s'il y a quelque chose de spécifique que je peux vous expliquer. –