0
私はサイズが巨大なinput1.csvとinput2.csvの2つのファイルを持っています。代替ソリューション巨大なファイルを解析するため
input1.csvには、3つの列A、B、Cがあります(Bはこのファイルで一意です)。
input2.csvは2列BとC
私はBのそれぞれのoccuranceがinput2.csvファイルで発生した回数を確認したいがあります。
私はarraylistのinput1.csvファイルからBの値を格納して実装しました。また、input2.csvファイルのBの値としてBの値としてkeyを使用するhashmapを使用しました。 このロジックは正常に動作しますが、ファイルサイズが増加すると実行時間が長くなります。また、メインメソッド自体でコードを終了しました。この問題を解決する他のロジックはありますか?私はJavaに新しいので、誰も私にこの問題を解決するための良いデザインパターンを提供できますか?
プログラム:
import java.io.*;
import java.util.*;
public class Demo {
public static void main(String[] args) throws IOException{
BufferedReader reader = null;
String encoding = "UTF-8";
String comma = ",";
Map<String,Integer> hashMap = new HashMap<>();
ArrayList<String> arrayList = new ArrayList<String>();
reader = new BufferedReader(new InputStreamReader(new FileInputStream("input1.csv"), encoding));
for (String line; (line = reader.readLine()) != null;) {
String val = line.split(comma)[1];
arrayList.add(val); //Value to be later used
hashMap.put(val,0);
}
reader.close();
reader = new BufferedReader(new InputStreamReader(new FileInputStream("input2.csv"), encoding));
for (String line; (line = reader.readLine()) != null;) {
String val = line.substring(0,line.indexOf(","));
if(hashMap.get(val) !=null) {
hashMap.put(val, hashMap.get(val) + 1);
}
}
reader.close();
printMap(hashMap);
}
public static void printMap(Map mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}
}
あなたの説明から、これは良い解決策であるようです。ハッシュマップの値を確認/増加させるだけであれば、大規模な減速を経験すべきではありません。ハッシュマップはO(1)償却です。あなたのコードを投稿する必要があります、私はコアアルゴリズムに関連していないいくつかのコーディングの問題があると信じています。 – lexicore
こんにちは@lexicoreが自分のコードを更新しました。 – RAGA