解析大文件的替代解决方案

时间:2017-02-03 15:20:19

标签: java file

我有两个文件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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的代码或多或少都很好。我不认为你可以做得更好。

一些评论:

  • 你实际上从不使用arrayList。如果您确实需要检查第一个文件中是否存在第二个文件中的值,则应创建一个has set并检查contains - 但仅在遇到新值时才会显示。
  • 您可以多次访问地图(hashMap.get(val),然后hashMap.put(val, hashMap.get(val) + 1))。只需在变量中保存hashMap.get(val)即可删除其中一个访问。
  • 使用mutable AtomicInteger作为值。您可以通过值hashMap.put避免incrementAndGet
  • 使用AtomicInteger,您可以hashMap.putIfAbsent(value, new AtomicInteger(0)).incrementAndGet()