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

拉加

我有两个文件input1.csv和input2.csv,它们的大小很大。

input1.csv具有三列A,B和C(B在此文件中是唯一的)。

input2.csv具有2列B和C。

我想检查在input2.csv文件中每次出现B的次数。

我已经实现了通过将input1.csv文件中的值B存储在arraylist中并使用哈希图将key作为B的值并将value作为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
        }
    }
}
Lexicore

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

一些评论:

  • 您实际上从未使用过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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java“ scheduleAtFixedRate”替代解决方案?

返回结果并引发异常替代解决方案

.NET Core中HostingEnvironment.QueueBackgroundWorkItem的替代解决方案

Haskell算法建议和替代解决方案的建议

优雅的解析日期的解决方案

安全密钥存储到恒定文件中是否安全或建议任何替代解决方案?

跨浏览器解决方案,用于从经过身份验证的端点下载大文件

匹配子字符串的替代解决方案

使用Pandas Transform实现替代解决方案

交叉编译后缺少共享库的替代解决方案?

使用替代解决方案提高回路性能

Python-替代迭代解决方案

Elasticsearch中累积基数聚合的替代解决方案

并行numpy数组应用程序的替代解决方案

pyhton拆分功能的替代解决方案

用于创建行驶时形状文件的替代解决方案?

是否有任何解决方案/实用程序可以同时压缩和上传大文件?

计算从1到n的个数的替代解决方案

从本地计算机将大文件上传到Amazon Web Services的解决方案

使用命令行制作单个文件的多个副本的替代解决方案?

河内塔-替代解决方案

嵌套“ For”循环的替代解决方案

mysql查询中的concat()函数或替代解决方案

Android 模拟器的替代解决方案

如何使用 7-zip 命令(或任何替代解决方案)获取 RAR 文件卷索引

将参数传递给关系函数或替代解决方案

拆分函数的python替代解决方案

随机化 JLabel 的替代解决方案

mysql ON DUPLICATE KEY UPDATE 的替代解决方案