Вопрос

Я пытаюсь прочитать файл Java и изменять его одновременно. Это то, что мне нужно сделать: мой файл имеет формат:

aaa
bbb
aaa
ccc
ddd
ddd

Мне нужно прочитать через файл и получить счет № вхождений и изменить дубликаты, чтобы получить следующий файл:

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

Я пытался использовать RandomAccessFile сделать это, но не мог это сделать. Может кто-нибудь помочь мне с кодом для этого?

Это было полезно?

Решение

Это гораздо легче, если вы не делаете две вещи одновременно. Лучший способ - пройти через весь файл, подсчитать все вхождения каждой строки в хэш, а затем записать все результаты в другой файл. Затем, если вам нужно, переместите новый файл на старый.

Вы никогда не хотите читать и писать в тот же файл одновременно. Ваши смещения в файле будут смещены каждый раз, когда вы делаете запись, и курсор чтения не будет отслеживать это.

Другие советы

Я бы сделал это таким образом: - анализ оригинального файла и сохранить все записи в новый файл. Используйте блоки данных с фиксированной длиной для записи записей в новый файл (так, скажем, ваша длинная строка длиной 10 байтов, возьмите 10 + x в виде длины блока, X предназначен для дополнительной информации, которую вы хотите сохранить вдоль записей. Так что 10-я запись В файле будет в байтовом положении 10 * (10 + x)). Тебе также придется знать количество записей для создания (поэтому размер файла nofegentries * BloadLength, используйте RandomacceFile и Setlength, чтобы установить эту длину файла). - Теперь используйте алгоритм Quicksort для сортировки записей в файле (моя идея состоит в том, чтобы иметь отсортированный файл в конце, что делает вещи гораздо проще и быстрее, наконец, тоже. Хешинг теоретически тоже работал, но вам придется иметь дело с переходными дубликатами Тогда все дубликаты сгруппированы - не совсем выбор здесь). - Проанализируйте файл с текущими записями. Сохраните указатель на запись первого представления о входе. Увеличение количества дубликатов, пока не появится новая запись. Измените первую запись и добавьте эту добавку информации, которую вы хотите иметь в новом файле «окончательный результат». Продолжайте этот путь со всеми остальными записями в отсортированном файле.

Выводы: Я думаю, что это должно быть достаточно быстрым и использовать разумное количество ресурсов. Тем не менее, это зависит от имеющих вас данных. Если у вас очень большое количество дубликатов, производительность QuickSort будет унижать. Кроме того, если ваша самая длинная запись данных находится дольше, чем в среднем, она также будет отпущена файловым пространством.

Если вам нужно, есть способы, которыми вы можете манипулировать тот же файл и обновлять счетчики, без необходимости открывать другой файл или сохранять все в памяти. Однако самый простой из подходов будет очень медленным.

 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){}
           }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top