Pregunta

Estoy intentando leer un archivo Java y modificarlo de forma simultánea. Esto es lo que tengo que hacer: Mi archivo tiene el formato:

aaa
bbb
aaa
ccc
ddd
ddd

Tengo que leer a través del archivo y obtener el recuento del # de ocurrencias y modificar los duplicados para obtener el siguiente archivo:

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

He intentado utilizar el RandomAccessFile para hacer esto, pero no podía hacerlo. ¿Puede alguien ayudarme con el código para éste?

¿Fue útil?

Solución

Es mucho más fácil si no hacer dos cosas al mismo tiempo. La mejor forma de hacerlo es ejecutar a través de todo el archivo, contar todas las ocurrencias de cada cadena en un hash y luego escribir todos los resultados en otro archivo. A continuación, si es necesario, mueva el archivo nuevo sobre el viejo.

Uno nunca quiere leer y escribir en el mismo archivo al mismo tiempo. Sus desplazamientos dentro del archivo se desplazará cada vez que hacen una escritura y el cursor de lectura no hará un seguimiento de ello.

Otros consejos

me gustaría hacerlo de esta manera: - analizar el archivo original y guardar todas las entradas en un archivo nuevo. Utilizar los bloques de datos de longitud fija a las entradas de escritura en el archivo nuevo (por lo que, diga su cadena más larga es de 10 bytes de longitud, tomar 10 + x como longitud de bloque, x es por la información adicional que desea guardar lo largo de las entradas. Así que la entrada 10a en el archivo estaría en posición de byte 10 * (10 + x)). También tendría que conocer el número de entradas para crear la (por lo que el tamaño del archivo sería noOfEntries * BlockLength, use un RandomAccesFile y setLength para establecer la longitud este archivo). - Ahora usa la clasificación rápida algoritmo para ordenar las entradas en el archivo (mi idea es tener un archivo ordenado en el extremo que hace las cosas mucho más fácil y más rápido finalmente Hashing teóricamente podrían trabajar también, pero usted tendría que hacer frente a la reordenación de las entradas duplicadas. a continuación, tener todos los duplicados agrupados - no es realmente una opción aquí). - analizar el archivo con las entradas ya ordenados. Guardar un puntero a la entrada de la primera aparición de una entrada. Incrementar el número de duplicados hasta que haya una nueva entrada. Cambiar la primera entrada y añadir esa información additonal usted quiere tener allí en un nuevo archivo "resultado final". Continuar de esta manera con todas las entradas que quedan en el archivo ordenado.

Conclusiones: Creo que esto debería ser un razonablemente rápido y utilizan cantidad razonable de recursos. Sin embargo, depende de los datos que tiene. Si usted tiene un gran número de duplicados, quicksort el rendimiento se degradará. Además, si su entrada de datos más larga es mucho más largo que el promedio, sino que también un desperdicio de espacio de archivos.

Si es necesario, hay maneras en que puede manipular el mismo archivo y actualizar los contadores, sin tener que abrir otro archivo o mantener todo en su memoria. Sin embargo, el más simple de los enfoques sería muy lento.

 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){}
           }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top