6

我正在尝试读取一个 java 文件并同时对其进行修改。这是我需要做的:我的文件格式为:

aaa
bbb
aaa
ccc
ddd
ddd

我需要通读文件并获取出现次数并修改重复项以获取以下文件:

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

我尝试使用RandomAccessFile来执行此操作,但无法执行此操作。有人可以帮我解决这个问题吗?

4

4 回答 4

8

如果你不同时做两件事会容易得多。最好的方法是遍历整个文件,计算每个字符串在哈希中出现的所有次数,然后将所有结果写到另一个文件中。然后,如果需要,将新文件移到旧文件上。

您永远不想同时读取和写入同一个文件。每次您进行写入时,您在文件中的偏移量都会发生变化,并且读取光标不会跟踪它。

于 2010-11-22T23:15:41.880 回答
1

我会这样做: - 解析原始文件并将所有条目保存到一个新文件中。使用固定长度的数据块将条目写入新文件(因此,假设您的最长字符串为 10 个字节长,以 10 + x 作为块长度,x 是您要在条目中保存的额外信息。所以第 10 个条目文件中的字节位置为 10*(10+x))。您还必须知道要创建的条目数(因此文件大小为 noOfEntries*blocklength,使用 RandomAccesFile 和 setLength 来设置此文件长度)。- 现在使用快速排序算法对文件中的条目进行排序(我的想法是最后有一个排序的文件,这使得事情最终变得更容易和更快。散列理论上也可以工作,但你必须处理重新排列重复的条目然后将所有重复项分组 - 这里不是一个真正的选择)。- 使用现在排序的条目解析文件。保存指向第一次出现的条目的条目的指针。增加重复的数量,直到有一个新条目。更改第一个条目并将您想要的附加信息添加到新的“最终结果”文件中。以这种方式继续排序文件中的所有剩余条目。

结论:我认为这应该是相当快并且使用合理数量的资源。但是,这取决于您拥有的数据。如果您有大量重复项,则快速排序性能会下降。此外,如果您最长的数据输入比平均时间长,也会浪费文件空间。

于 2011-02-22T14:36:37.293 回答
0

如果必须,有一些方法可以操作同一个文件并更新计数器,而无需打开另一个文件或将所有内容保存在内存中。然而,最简单的方法会非常缓慢。

于 2010-11-23T00:44:46.670 回答
-2
 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){}
           }
        }
    }
于 2013-08-18T17:26:45.647 回答