3 votes

Trouver les mots manquants dans une chaîne de caractères

J'essaie de résoudre un problème de recherche de mots manquants dans une chaîne de caractères.

Par exemple :
Entrée
String 1 = "I love programming, pizza, coke and chips";
String 2 = "I programming, chips";
Sortie requise
Missing words = "love pizza coke";

Note L'ordre de sortie doit être le même (c'est là que je me trompe).

ce que j'ai jusqu'à présent, mais j'obtiens des résultats erronés.

public static List<String> findWord(String s, String t) {
    HashSet<String> missingWords = new HashSet<>();
    String[] words = s.split(" ");
    for(int i=0; i < words.length; i++) {
        if (!t.contains(words[i])) {
            missingWords.add(words[i]);
        }
    }
    List<String> ans = new ArrayList<String>();
    for (String str: missingWords) {
        ans.add(str);
    }

    return ans;
}

2voto

Tim Biegeleisen Points 53335

J'aborderais cette question en séparant les deux chaînes d'entrée, en supprimant la ponctuation, puis en parcourant chaque tableau de mots, dans l'ordre original. Lorsqu'une correspondance est trouvée, les deux listes avancent. Lorsqu'il n'y a pas de correspondance, la liste originale avance, mais pas la deuxième liste, et nous enregistrons également le mot original comme n'ayant pas trouvé de correspondance.

Le point clé ici est que nous utilisons un ArrayList qui maintient l'ordre d'insertion, tout en traversant.

String input = "I love programming, pizza, coke and chips";
String other = "I programming, chips";
String[] parts = input.replaceAll("[,.;-]", "").split("\\s");
String[] otherparts = other.replaceAll("[,.;-]", "").split("\\s");
List<String> missing = new ArrayList<>();
int pnt = 0;
for (int i=0; i < parts.length; ++i) {
    if (parts[i].equals(otherparts[pnt])) {
        ++pnt;
    }
    else {
        missing.add(parts[i]);
    }
}

System.out.println(Arrays.toString(parts));
System.out.println(Arrays.toString(missing.toArray()));

[I, love, programming, pizza, coke, and, chips]
[love, pizza, coke, and]

Démo

Démonstration ajoutée à titre d'information uniquement. Ne vous y fiez pas pour une utilisation en production.

0voto

Dang Nguyen Points 1179

HashSet est une collection non ordonnée et il n'est pas possible de stocker les éléments dans n'importe quel ordre, mais si vous devez accéder aux éléments de HashSet dans un ordre trié, vous pouvez d'abord le convertir en liste et ensuite le trier.

HashSet<String> missingWords = new HashSet<>();
...
missingWords.add(words[i]);// <== the order here is correct
...
for(String str: missingWords){// <== the order here is incorrect
   ans.add(str);
}

J'espère que vous le trouverez utile.

0voto

oleg.cherednik Points 7238

C'est un problème très simple.

  1. Divisez les deux chaînes de caractères avec des mots en utilisant RegExp : \W+
  2. Les mots attendus mis en HashSet : unique non ordonné
  3. Mots existants mis en ArrayList : non unique ordonné
  4. Supprimez tous les mots du List qui ne contient pas dans Set : removeAll()

Démonstration :

public static List<String> findMissingWords(String str, String expectedWords) {
    Set<String> expected = Arrays.stream(expectedWords.split("\\W+")).collect(Collectors.toSet());
    List<String> existed = Arrays.stream(str.split("\\W+")).collect(Collectors.toList());
    existed.removeAll(expected);
    return existed;
}

0voto

suvojit_007 Points 1439

Afin de maintenir l'ordre d'insertion, vous devez utiliser la fonction LinkedHashSet au lieu de HashSet .

String s = "I love programming, pizza, coke and chips";
        String t = "I programming, chips";

         LinkedHashSet<String> missingWords = new LinkedHashSet<>(); //<---to maintain the order
            String[] words = s.split(" ");
            for(int i=0; i < words.length; i++) {
                if (!t.contains(words[i])) {
                    missingWords.add(words[i].replaceAll(",", "")); //<---add without comma
                }
            }
            List<String> ans = new ArrayList<String>();
            for (String str: missingWords) {
                ans.add(str);
            }

            System.out.println(ans);

Sortie : [amour, pizza, coca, et]

0voto

irnugr Points 3

Veuillez essayer le code ci-dessous :

 public static void main(String []args){
    String s = "I love programming, pizza, coke and chips";
    String t = "I programming, chips";

    String[] firstWord = s.replaceAll(",","").split("\\s+");
    String[] secondWord = t.replaceAll(",","").split("\\s+");
    ArrayList<String> temp1 = new ArrayList<String>(Arrays.asList(firstWord));
    ArrayList<String> temp3 = new ArrayList<String>(Arrays.asList(firstWord));
    ArrayList<String> temp2 = new ArrayList<String>(Arrays.asList(secondWord));

    ArrayList<String> finals = new ArrayList<String>();

    finals.addAll(missingWords(temp1, temp2));
    finals.addAll(missingWords(temp2, temp3));

    System.out.println(finals);
 }

 static ArrayList<String> missingWords(ArrayList<String> str1, ArrayList<String> str2) {

     str1.removeAll(str2);

     return str1;
 }

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