Java:如何初始化和填充最终的静态有序Map?

Ton*_*nov 3 java initialization hashmap map

我在Java中有一个词干算法,它需要一个HashMap<String, String>预先填充大约30 000条记录的静态最终版本.

我需要地图按照插入顺序保存记录(我得到了一个提示,我可以使用LinkedHashMap?).

我以为我可以在Java类文件中手动插入值,因为这是在RAM中加载它们的最快方法(时间/生产力对于这个项目非常重要),通过使用30 000个调用

map.put("Key", "Value");
Run Code Online (Sandbox Code Playgroud)

问题是,java(或者至少是eclipse)在任何段/方法等中只允许65kb的代码.所以我最终扩展了11个类并将65kb的.puts放在构造函数或者static { }.

一切都很好,但是当我运行它时,订单就会被打乱.对于这么多行,我无法在扩展顺序或地图中跟踪出错的地方.

那么,请告诉我你在java中填写最终地图的最佳方式是什么.

PS:从文件加载和解析记录太慢了......

Sea*_*oyd 5

一切都很好,但是当我运行它时,订单就会被打乱.对于这么多行,我无法在扩展顺序或地图中跟踪出错的地方.

a)HashMap不保留插入顺序.请LinkedHashMap改用.或者,因为你将它用作常数,考虑一个番石榴ImmutableMap.它保留插入oder,是不可变的,并提供了一个构建器对象,用于构造具有许多值的构造对象.

b)

PS:从文件加载记录太慢了......

为什么?在课堂加载期间,它只会完成一次.35K字符串/字符串对实际上并不是现代机器的大量数据.

  • @pst,`ImmutableMap`提供插入排序.即使对于`String`,我也会使用`ImmutableMap`这个应用程序,毫无疑问.也就是说,我不会在一百万年内在类文件中放置30000行静态初始化.加载它.请. (5认同)
  • @SeanPatrickFloyd我会解决这个问题(35k行静态初始化)......首先.创建单例映射或静态映射实际上是一样的:它只创建一次.区别在于源,可以是几乎任何东西,从硬编码调用(在上面的例子中)到单个字符串(如果你想在类文件中保留所有"),或CSV文件或SQLite DB或者诸如此类的.确保在正确的上下文中运行*性能分析*,然后在失去清晰度的情况下追逐假设的性能增益.(在这两种情况下,结果都是在堆上创建的等效Map对象.) (2认同)