Question

Je suis en train de lire un fichier java et de modifier simultanément. Voilà ce que je dois faire: Mon dossier est du format:

aaa
bbb
aaa
ccc
ddd
ddd

Je dois lire le fichier et obtenir le nombre de # d'occurrences et de modifier les doublons pour obtenir le fichier suivant:

aaa -  2
bbb -  1
ccc -  1
ddd -  2

J'ai essayé d'utiliser le RandomAccessFile pour ce faire, mais n'a pas pu le faire. aider quelqu'un peut me avec le code de celui-ci?

Était-ce utile?

La solution

Il est beaucoup plus facile si vous ne faites pas deux choses en même temps. La meilleure façon est de courir à travers le fichier entier, compter toutes les occurrences de chaque chaîne dans un hachage, puis d'écrire tous les résultats dans un autre fichier. Ensuite, si vous avez besoin, déplacer le nouveau fichier sur l'ancien.

Vous ne voulez jamais lire et écrire dans le même fichier en même temps. Vos décalages dans le fichier se déplacera chaque fois que vous faire une écriture et le curseur de lecture ne conservera aucune trace de cela.

Autres conseils

Je le ferais de cette façon: - Parse le fichier d'origine et enregistrer toutes les entrées dans un nouveau fichier. Utiliser des blocs de données de longueur fixe à des entrées d'écriture dans le nouveau fichier (donc, dire que votre chaîne la plus longue est de 10 octets, prendre 10 + x comme longueur de bloc, x est pour l'info supplémentaire que vous souhaitez enregistrer sur les entrées. Donc, l'entrée 10 dans le fichier serait en position octet 10 * (10 + x)). Vous auriez également de connaître le nombre d'entrées pour créer la (si la taille du fichier serait noOfEntries * BlockLength, utilisez un RandomAccesFile et setLength pour régler la longueur du fichier cette). - Utilisez maintenant quicksort algorithme pour trier les entrées dans le fichier (mon idée est d'avoir un fichier Sorted à la fin ce qui rend les choses beaucoup plus facile et plus rapide enfin Hashage travailleraient théoriquement aussi, mais vous auriez à traiter réarranger les entrées en double. puis d'avoir tous les doublons regroupés - pas vraiment un choix ici). - Parse le fichier avec les entrées maintenant triées. Enregistrer un pointeur sur l'entrée de la première apparition d'une entrée. Incrémenter le nombre de doublons jusqu'à ce qu'il ya une nouvelle entrée. Modifier la première entrée et ajouter cette information additonal vous voulez avoir là dans un nouveau fichier « résultat final ». Continuez ainsi avec toutes les entrées restantes dans le fichier triée.

Conclusions: Je pense que cela devrait être un assez rapide et l'utilisation raisonnable des ressources. Cependant, cela dépend des données que vous avez. Si vous avez un très grand nombre de doublons, quicksort la performance se dégrade. En outre, si votre saisie de données le plus long est beaucoup plus longue que la moyenne, il perd également un espace de fichiers.

Si vous devez, il existe des moyens que vous pouvez manipuler le même fichier et mettre à jour les compteurs, sans avoir à ouvrir un autre fichier ou tout garder en mémoire. Cependant, le plus simple des approches serait très lent.

 import java.util.*;
 import java.io.*;
 import java.util.*;
 class WordFrequencyCountTest
 {
 public static void main( String args[])
 {
System.out.println(" enter the file name");
Scanner sc = new Scanner(System.in);
String fname= sc.next();    
     File f1 = new File(fname);


    if(!f1.exists())
    {
        System.out.println(" Source file doesnot exists");
        System.exit(0);
    }
    else{
        try{                
            FileReader fis = new FileReader(f1);
            BufferedReader br = new BufferedReader(fis);
            String str = "";
            int count=0;  
        Map<String, Integer> map = new TreeMap<String, Integer>(); 
            while((str = br.readLine()) != null )
            {
                String[] strArray = str.split("\\s");
                count=1;
                for(String token : strArray)   // iteration of strArray []
                {                       
                if(map.get(token)!=null )
            {
                        count=map.get(token);
                        count++;
                        map.put(token, count);
                        count=1;
                    }else{
                        map.put(token, count);

                    }
                }
            }

            Set set=map.entrySet();
            Iterator itr = set.iterator();    
            System.out.println("========");

            while(itr.hasNext())
            {
                Map.Entry entry = (Map.Entry)itr.next();

                System.out.println( entry.getKey()+ " "+entry.getValue());
            }               
            fis.close();            
        }catch(Exception e){}
           }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top