Java:ファイルを一緒に読み書きします
質問
Javaファイルを読み、同時に変更しようとしています。これは私がする必要があることです。私のファイルは形式です。
aaa
bbb
aaa
ccc
ddd
ddd
ファイルを読んで、発生#のカウントを取得し、重複を変更して次のファイルを取得する必要があります。
aaa - 2
bbb - 1
ccc - 1
ddd - 2
を使用してみました RandomAccessFile
これを行うことはできませんでしたが、できませんでした。誰かがこのコードのコードを手伝ってくれますか?
解決
同時に2つのことをしないと、はるかに簡単です。最良の方法は、ファイル全体を実行し、各文字列のすべての発生をハッシュ中のすべての発生をカウントし、すべての結果を別のファイルに書き留めることです。必要に応じて、新しいファイルを古いファイルに移動します。
同時に同じファイルに読み書きをしたくありません。ファイル内のオフセットは、書き込みを行うたびにシフトし、読み取りカーソルはそれを追跡しません。
他のヒント
このようにします。-元のファイルを解析し、すべてのエントリを新しいファイルに保存します。固定された長さのデータブロックを使用して新しいファイルにエントリを書き込みます(したがって、最長の文字列が長さ10バイトで、ブロック長として10 + xを取ると、xはエントリに沿って保存する追加の情報用です。ファイルはバイト位置10*(10+x)になります。また、(ファイルサイズがnoofentries*blockLengthになり、ランダムアクセファイルとSetLengthを使用してこのファイルの長さを設定する)を作成するためにエントリの数を知る必要があります。 - QuickSortアルゴリズムを使用してファイル内のエントリをソートします(私のアイデアは、最終的に物事をはるかに簡単かつ速くするためにソートされたファイルを持つことです。次に、すべての複製をグループ化するために - ここでは実際には選択肢ではありません)。 - ソートされたエントリでファイルを解析します。エントリの最初の発生のエントリにポインターを保存します。新しいエントリが発生するまで重複の数を増やします。最初のエントリを変更して、新しい「最終結果」ファイルに掲載したいadditonal情報を追加します。ソートされたファイルに残っているすべてのエントリを使用して、この方法を続けます。
結論:これは適度に速く、合理的な量のリソースを使用する必要があると思います。ただし、持っているデータに依存します。非常に多くの重複がある場合、クイックソートのパフォーマンスが低下します。また、最長のデータ入力が平均よりもはるかに長い場合、ファイルスペースも無駄になります。
必要な場合は、同じファイルを操作してカウンターを更新して、別のファイルを開いたり、すべてをメモリにしたりすることなく、カウンターを更新する方法があります。ただし、最も単純なアプローチは非常に遅くなります。
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){}
}
}
}