Domanda

Sto cercando di leggere un file java e modificarlo contemporaneamente. Questo è quello che devo fare: Il mio file è del formato:

aaa
bbb
aaa
ccc
ddd
ddd

Ho bisogno di leggere attraverso il file e ottenere il conteggio del # di occorrenze e modificare i duplicati per ottenere il seguente file:

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

Ho provato ad utilizzare il RandomAccessFile per fare questo, ma non potevo farlo. Qualcuno può aiutarmi con il codice per questo?

È stato utile?

Soluzione

E 'molto più facile se non fare due cose allo stesso tempo. Il modo migliore è quello di correre attraverso l'intero file, contare tutte le occorrenze di ogni stringa in un hash e poi scrivere tutti i risultati in un altro file. Allora se è necessario, spostare il nuovo file su quello vecchio.

Non hai mai voglia di leggere e scrivere lo stesso file nello stesso momento. I suoi offset all'interno del file si sposterà ogni volta che si effettua una scrittura e il cursore di lettura non mancherà di tenere traccia di tutto questo.

Altri suggerimenti

mi piacerebbe fare in questo modo: - analizzare il file originale e salvare tutte le voci in un nuovo file. Utilizzare i blocchi di dati di lunghezza fissa alle voci di scrittura al nuovo file (così, ad esempio la stringa più lunga è di 10 byte, prendere 10 + x come lunghezza del blocco, x è per le informazioni supplementari che si desidera salvare lungo le voci. Quindi la voce di 10 ° nel file sarebbero a byte posizione 10 * (10 + x)). Faresti anche necessario conoscere il numero di voci per creare il (così la dimensione del file sarebbe noOfEntries * BlockLength, utilizzare un RandomAccesFile e SetLength per impostare la lunghezza questo file). - Ora usare quicksort algoritmo per ordinare le voci del file (la mia idea è di avere un file ordinato alla fine, che rende le cose molto più facile e più veloce, infine, hashing sarebbero teoricamente lavorare troppo, ma si sarebbe avere a che fare con riorganizzare le voci duplicate. poi di avere tutti i duplicati raggruppate - non proprio una scelta qui). - analizzare il file con le voci ora ordinati. Salvare un puntatore alla voce della prima occorrenza di una voce. Incrementa il numero di duplicati finché non ci sarà una nuova voce. Modificare la prima voce e aggiungere queste informazioni additonal si desidera avere lì in un nuovo file "risultato finale". Continuare in questo modo con tutte le voci rimanenti del file ordinato.

In conclusione, credo che questo dovrebbe essere un ragionevolmente veloce e utilizzare quantità ragionevole di risorse. Tuttavia, esso dipende dai dati che avete. Se si dispone di un gran numero di duplicati, quicksort prestazioni si degradano. Inoltre, se l'immissione di dati più lungo è il modo più lungo della media, sarà anche sprecare spazio file.

Se si deve, ci sono modi per manipolare lo stesso file e aggiornare i contatori, senza dover aprire un altro file o tenere tutto in memoria. Tuttavia, il più semplice degli approcci sarebbe molto lenta.

 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){}
           }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top