2017-02-03 89 views
0

我有两个文件input1.csv和input2.csv其大小很大。替代解决方案解析巨大的文件

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

input2.csv有2列B和C.

我要检查B的每一次出现多少次发生在input2.csv文件。

我已经实现了将input1.csv文件中的值B存储在arraylist中,并使用hashmap作为B的值和值,作为B在input2.csv文件中的出现。 这个逻辑工作正常,但是当文件大小增加时执行时间增加。也已经完成了主方法本身的代码。有没有其他的逻辑来解决这个问题?由于我是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

从您的描述来看,它似乎是一个很好的解决方案。如果你只是检查/增加哈希映射中的值,你不应该经历重大衰变,哈希映射是O(1)摊销。你应该发布你的代码,我相信你有一些与核心算法无关的编码问题。 – lexicore

+0

嗨@lexicore已更新我的代码。 – RAGA

回答

0

你的代码是多还是少罚款。我不认为你可以做得更好。

几点意见:

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