Frage

Ich versuche, eine Java-Datei zu lesen und gleichzeitig ändern. Dies ist, was ich tun muss: Meine Datei des Formats ist:

aaa
bbb
aaa
ccc
ddd
ddd

Ich muss durch die Datei lesen und die Zählung der Anzahl der Ereignisse zu erhalten und die Duplikate ändern Sie die folgende Datei erhalten:

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

Ich habe versucht, die RandomAccessFile mit, dies zu tun, aber kann es nicht tun. Kann jemand mir helfen, für diesen einen mit dem Code aus?

War es hilfreich?

Lösung

Es ist viel einfacher, wenn Sie nicht zur gleichen Zeit zwei Dinge tun. Der beste Weg ist durch die gesamte Datei, zählen alle Vorkommen jedes Strings in einem Hash und dann schreiben Sie alle Ergebnisse in eine andere Datei auszuführen. Dann, wenn Sie benötigen, um die neue Datei über die alten bewegen.

Sie wollen nie auf die gleiche Datei zur gleichen Zeit zu lesen und zu schreiben. Ihre Offsets in der Datei verschiebt sich jedes Mal wenn Sie eine Schreib- und die Lese Cursor machen nicht den Überblick über das halten.

Andere Tipps

Ich würde es auf diese Weise tun: - Parse die Originaldatei und speichern Sie alle Einträge in eine neue Datei. Verwenden fester Länge Datenblöcke zu schreiben Einträge in die neue Datei (also sagen, dass Ihre längste Zeichenfolge 10 Byte lang ist, nehmen 10 + x als Blocklänge, x für die zusätzlichen Informationen, die Sie entlang der Einträge speichern möchten. So den 10. Eintrag in der Datei bei der Byteposition 10 * wäre (10 + x)). Sie würden auch die Anzahl der Einträge wissen müssen die erstellen (so die Dateigröße würde noOfEntries * Blocklength, eine RandomAccesFile und SetLength verwenden diese Datei Länge eingestellt). - Verwenden Sie nun quicksort Algorithmus, um die Einträge in der Datei zu sortieren (meine Idee ist eine sortierte Datei am Ende zu haben, die Dinge viel einfacher und schneller schließlich macht Hashing theoretisch auch funktionieren würden, aber Sie würden zu tun haben Neuanordnung doppelte Einträge. haben dann alle Duplikate gruppiert - hier nicht wirklich eine Wahl). - Parse die Datei mit den jetzt sortiert Einträge. Speichern Sie einen Zeiger auf den Eintrag des ersten Auftretens eines Eintrags. Erhöhen Sie die Anzahl der Duplikate, bis ein neuer Eintrag. Ändern Sie den ersten Eintrag und fügen Sie diese zusätzliche Informationen, die Sie dort in eine neue „Endergebnis“ Datei haben wollen. Weiter auf diese Weise mit den restlichen Einträgen in der sortierten Datei.

Schlussfolgerungen: Ich denke, dass dies ein ziemlich schnell sein sollte, und verwenden Sie angemessene Menge an Ressourcen. Allerdings hängt es von den Daten, die Sie haben. Wenn Sie eine sehr große Anzahl von Duplikaten haben, verschlechtert quicksort Leistung. Auch wenn Ihre längste Dateneingabe Art und Weise länger als der Durchschnitt ist, wird es auch Dateibereich verschwenden.

Wenn Sie zu haben, gibt es Möglichkeiten, wie Sie die gleiche Datei bearbeiten können und die Zähler aktualisieren, ohne eine andere Datei zu öffnen oder hält alles im Speicher. Allerdings wäre die einfachste der Ansätze sehr langsam.

 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){}
           }
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top