当前位置: 首页 > 知识库问答 >
问题:

如何在java中使用迭代器模式批量加载文件到hashmap

孟鹤龄
2023-03-14

我有一个包含两百万行的大文件。我希望遍历文件的每一行,将其处理为一个键值对,并将其存储到hashmap中,以便稍后进行比较。然而,出于空间复杂性的考虑,我不希望有一个包含200万个键值对的hashmap。相反,我希望遍历N行文件,并将它们的键值对加载到hashmap中,进行比较,然后将接下来的N行加载到hashmap中,依此类推。

用例的一个例子:

文件txt:

1 Jack London
2 Mary Boston
3 Jay  Chicago
4 Mia  Amsterdam
5 Leah New York
6 Bob  Denver
.
.
.

假设N=3作为hashmap的大小,在第一次迭代时,hashmap将存储文件前三行的键值对,即

1 Jack London
2 Mary Boston
3 Jay  Chicago

在对这些键值对进行比较后,接下来的3行将作为键值对加载到hashmap中:

4 Mia  Amsterdam
5 Leah New York
6 Bob  Denver

依此类推,直到文件中的所有行都被迭代过。我如何使用java中的迭代器设计模式来实现这一点?

共有1个答案

归松
2023-03-14

你可以这样做:

public class Temp {

  public static void main(String[] args) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(get file input stream here));
    int maxSize = 3;
    Map<String, String> map = new HashMap<>(maxSize);
    String line = reader.readLine();
    while (line != null) {
      String[] data = line.split("\\s+");//some dummy parsing
      String key = data[1];
      String value = data[2];
      map.put(key, value);
      if (map.size() == maxSize) {
        //do whatever operations you need
        System.out.println(map);
        map.clear();
      }
      line = reader.readLine();
    }
    if (map.size() > 0) {
      //deal with leftovers
      System.out.println(map);
    }
  }
}

基本上读取和解析地图,直到地图达到最大大小,然后操作内容并清空它。继续这样做,直到你读完了整个文件。最后,如果有剩余内容,请对其进行操作。

 类似资料:
  • 我正在从Cloudera包裹中运行带有Spark 0.9.0的CDH 4.4。 我有一堆Avro文件是通过Pig的AvroStorage UDF创建的。我想在 Spark 中加载这些文件,使用通用记录或载入 Avro 文件的架构。到目前为止,我已经尝试过这个: 这适用于一个文件,但它不能扩展——我将所有数据加载到本地RAM中,然后从那里跨spark节点分发。

  • 主要内容:介绍,实现,Iterator.java,Container.java,NameRepository.java,IteratorPatternDemo.java迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。

  • 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭

  • 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭

  • 迭代器模式中,迭代器(允许我们遍历集合中所有元素的对象)顺序迭代一个集合对象中的元素而无需暴漏其底层形式。 迭代器封装了这种特别的迭代操作的内部结构,就jQuery的jQuery.fn.each()迭代器来说,我们实际上可以使用jQuery.each()底层的代码来迭代一个集合,而无需知道或者理解后台提供这种功能的代码是如何实现的。 这种模式可以被理解为门面模式的一种特例,在这里我们只处理与迭代有

  • 迭代器模式 使用过C++的朋友大概对迭代器模式都不会太陌生。这主要是因为我们在编写代码的时候离不开迭代器,队列有迭代器,向量也有迭代器。那么,为什么要迭代器呢?这主要是为了提炼一种通用的数据访问方法。 比如说,现在有一个数据的容器, typedef struct _Container { int* pData; int size; int length;