2012-12-12 5 views
1

Bonjour à tous J'ai écrit un programme mergesort pour un tableau de chaînes qui lit les fichiers .txt de l'utilisateur. Mais ce que je veux faire maintenant est de comparer les deux fichiers et d'imprimer les mots dans le fichier un et non dans le fichier deux par exemple apple est dans le fichier 1 mais pas le fichier 2. J'ai essayé de le stocker dans un tableau de chaînes à la fin, mais je ne peux pas sembler mettre en œuvre. Voici ce que j'ai,Java String Array Mergesort

FileIO reader = new FileIO(); 
    String words[] = reader.load("C:\\list1.txt"); 
    String list[] = reader.load("C:\\list2.txt"); 

    mergeSort(words); 
    mergeSort(list); 
    String x = null ; 

    for(int i = 0; i<words.length; i++) 
    { 
     for(int j = 0; j<list.length; j++) 
     { 
       if(!words[i].equals(list[j])) 
       { 
         x = words[i]; 
       } 
     } 
    } 

    System.out.println(x); 

Toute aide ou suggestion serait appriciated!

+0

jamais votre chaîne x initialiser avec null, si les deux fichiers seront vides, ou tout simplement les mots fichier [], vous obtiendrez un NullPointerException. SVP dire 'String x =" ";'. et je ne reçois pas ce que tu veux. vous voulez imprimer chaque mot, qui n'est pas dans votre deuxième fichier? – SomeJavaGuy

Répondre

1

Si vous voulez vérifier les mots qui sont dans le premier tableau, mais n'existent pas dans le second, vous pouvez faire comme ceci:

boolean notEqual = true;   
for(int i = 0; i<words.length; i++) 
    { 
     for(int j = 0; j<list.length && notEqual; j++) 
     { 
       if(words[i].equals(list[j]))  // If the word of file one exist 
       {        // file two we set notEqual to false 
         notEqual = false;   // and we terminate the inner cycle 
       } 
     } 
     if(notEqual)      // If the notEqual remained true 
      System.out.println(words[i]); // we print the the element of file one 
              // that do not exist in the second file 

     notEqual = true;     // set variable to true to be used check 
    }          // the other words of file one. 

Fondamentalement, vous prenez un mot du premier fichier (chaîne à partir du tableau) et vérifiez s'il y a un mot dans le fichier deux qui est égal. Si vous le trouvez, vous définissez la variable de contrôle notEqual sur false, ce qui permet de sortir de la boucle interne et de ne pas imprimer le mot. Sinon, s'il n'y a pas de mot sur le fichier deux qui correspondent au mot du fichier un, la variable de contrôle notEqual sera true. Par conséquent, imprimer l'élément en dehors de la boucle interne pour.

Vous pouvez remplacer l'instruction d'impression, pour une autre qui stocke le mot unique dans un tableau supplémentaire, si vous le souhaitez.

Une autre solution, bien plus lente que la première:

 List <String> file1Words = Arrays.asList(words); 
    List <String> file2Words = Arrays.asList(list); 

    for(String s : file1Words) 
     if(!file2Words.contains(s)) 
      System.out.println(s); 

Vous convertissez vos tableaux à une liste en utilisant la méthode Arrays.asList et utilisez la méthode contient pour vérifier si le mot du premier fichier est sur le deuxième fichier.

+0

Merci J'ai une solution de travail maintenant, mais je me demandais s'il y avait un moyen de rendre cela très rapide? Existe-t-il un autre moyen de comparer les fichiers pour le rendre plus rapide? – user1816464

+0

@ user1816464 Pour le but que vous voulez, votre première solution est assez décente. – dreamcrash

0

Cela ressemble à peu près. Qu'est-ce que vous faites est pour chaque chaîne words, vous le comparez à chaque mot dans list, donc si vous avez même une chaîne dans list qui n'est pas dans words, est en cours.

Ce que je suggère est de changer if(!words[i].equals(list[j])) à if(words[i].equals(list[j])). Donc maintenant vous savez que la chaîne de words apparaît dans list, vous n'avez donc pas besoin de l'afficher. Si vous parcourez complètement list sans voir le mot, alors vous savez que vous avez besoin de l'expliquer. Donc, quelque chose comme ceci:

for(int i = 0; i<words.length; i++) 
{ 
    boolean wordFoundInList = false; 

    for(int j = 0; j<list.length; j++) 
    { 
      if(words[i].equals(list[j])) 
      { 
        wordFoundInList = true; 
        break; 
      } 
    } 

    if (!wordFoundInList) { 
     System.out.println(x); 
    } 
} 
+0

Merci c'est comme je cherchais, mais j'essaie de le comparer aussi vite que je le peux, est-ce que ça peut être plus rapide ou est-ce qu'il y a une façon différente de le faire aussi vite que possible? – user1816464

+0

Pas que je sache. À la fin de la journée, vous devrez parcourir tous les éléments jusqu'à ce que vous les ayez tous vérifiés ou que vous ayez trouvé une chaîne dans les deux listes. Dans ce cas, vous pouvez sortir de la boucle, ce que je fais. – JosephRT

+0

Heh, c'est le C# qui sort, merci pour le catch. – JosephRT

0

Vous pouvez également simplement parcourir la boucle et l'ajouter lorsque vous avez atteint list.length-1. et si elle correspond, vous pouvez briser toute substance

FileIO reader = new FileIO(); 
String words[] = reader.load("C:\\list1.txt"); 
String list[] = reader.load("C:\\list2.txt"); 

mergeSort(words); 
mergeSort(list); 
//never ever null 
String x = "" ; 

for(int i = 0; i<words.length; i++) 
{ 
    for(int j = 0; j<list.length; j++) 
    { 
      if(words[i].equals(list[j])) 
       break; 
      if(j == list.length-1) 
       x += words[i] + " "; 
    } 
} 

System.out.println(x); 
0

Voici une version (si elle n'utilise pas le tri)

String[] file1 = {"word1", "word2", "word3", "word4"}; 
    String[] file2 = {"word2", "word3"}; 
    List<String> l1 = new ArrayList(Arrays.asList(file1)); 
    List<String> l2 = Arrays.asList(file2); 
    l1.removeAll(l2); 
    System.out.println("Not in file2 " + l1); 

imprime

Not in file2 [word1, word4] 
1

Pourquoi ne pas simplement convertir les tableaux à des ensembles? Ensuite, vous pouvez simplement faire result = wordsSet.removeAll (listSet); Votre résultat contiendra tous les mots qui n'existent pas dans la liste2.txt

également garder à l'esprit que l'ensemble supprimera les doublons;)