2010-11-22 3 views
6

javaファイルを読み込んで同時に変更しようとしています。これは私が何をする必要があるかである:私のファイルは、形式は次のとおりです。JAVA:一緒にファイルを読み書きする

aaa 
bbb 
aaa 
ccc 
ddd 
ddd 

私はファイルを読みと出現の#のカウントを取得し、次のファイルを取得するには、重複を変更する必要があります。

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

私はRandomAccessFileを使ってこれを試みましたが、できませんでした。誰かがこのコードのコードで私を助けることができますか?

答えて

8

同時に2つのことをしないと、はるかに簡単です。最も良い方法は、ファイル全体を実行し、ハッシュの各文字列のすべての出現を数え、すべての結果を別のファイルに書き出すことです。次に、必要な場合は、新しいファイルを古いファイルに移動します。

同時に同じファイルを読み書きすることは決してありません。ファイル内のオフセットは書き込みを行うたびにシフトし、読み込みカーソルはそれを追跡しません。

+0

これは私の考えでもあり、ちょっと時間がかかりすぎて作業が途切れてしまいました。 –

+1

問題は、私が持っているファイルが大きすぎるということです。私はファイル操作に頼る以外に選択肢がありません:(悪いアイデアだが、それ以外のものはありません。) – sharath

+0

最長の文字列の長さはどのくらいですか?最悪の場合、本質的にあなた自身のものを書くのではなく、データベースを使うべきです。 –

0

する必要がある場合は、別のファイルを開いたり、すべてをメモリに保存したりせずに、同じファイルを操作してカウンタを更新する方法があります。しかし、最も簡単なアプローチは非常に遅いでしょう。

1

私はこのようにします: - 元のファイルを解析し、すべてのエントリを新しいファイルに保存します。固定長のデータブロックを使用して新しいファイルにエントリを書き込む(つまり、最長の文字列が10バイトで、ブロック長として10 + x、xはエントリに保存する追加の情報です。バイト位置10 *(10 + x)になります。また、ファイルのサイズをnoOfEntries * blocklengthにするには、このファイルの長さを設定するためにRandomAccesFileとsetLengthを使用するように、エントリの数を知る必要があります。 - クイックソートアルゴリズムを使用してファイル内のエントリをソートします(私の考えは最後にソートされたファイルを持っているため、最終的にははるかに簡単で高速になります)エントリはグループ化されたすべての重複を持つことになります - ここでの選択肢ではありません)。 - ソートされたエントリでファイルを解析します。エントリの最初の出現のエントリへのポインタを保存します。新しいエントリがあるまで重複の数を増やします。最初のエントリを変更し、追加する情報を新しい「最終結果」ファイルに追加します。ソートされたファイルの残りのすべてのエントリでこの方法を続行します。

結論:これは合理的に速く、合理的な量のリソースを使用すべきだと私は考えます。しかし、それはあなたが持っているデータによって異なります。重複数が非常に多い場合、クイックソートのパフォーマンスが低下します。また、最長のデータ入力が平均より長い場合、ファイルスペースも浪費されます。

-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){} 
      } 
     } 
    } 
関連する問題