我有两个文件input1.csv和input2.csv,其大小很大。
input1.csv有三列A,B和C(B在此文件中是唯一的)。
input2.csv有2列B和C.
我想检查在input2.csv文件中每次出现B的次数。
我通过在arraylist中的input1.csv文件中存储值B并使用key作为B的值和值作为B在input2.csv文件中出现的值来实现。 这个逻辑工作正常,但是当文件大小增加时执行时间增加。还完成了main方法本身的代码。有没有其他逻辑来解决这个问题???既然我是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
}
}
}
答案 0 :(得分:0)
您的代码或多或少都很好。我不认为你可以做得更好。
一些评论:
arrayList
。如果您确实需要检查第一个文件中是否存在第二个文件中的值,则应创建一个has set并检查contains
- 但仅在遇到新值时才会显示。hashMap.get(val)
,然后hashMap.put(val, hashMap.get(val) + 1)
)。只需在变量中保存hashMap.get(val)
即可删除其中一个访问。AtomicInteger
作为值。您可以通过值hashMap.put
避免incrementAndGet
。AtomicInteger
,您可以hashMap.putIfAbsent(value, new AtomicInteger(0)).incrementAndGet()
。