我首先遇到的问题是尝试为字典间隙列表发布程序创建一个非常大的int [] [](7k×30k)。但是,我试图分配数组时空间不足。我怎样才能创建一个2-d整数数组?
我想要的是列表列表,其中列表中的每个列表都是整数列表。这是我的代码示例。
代码:
static final int numberOfTerms = 6782;
static final int numberOfLines = 30383;
byte[][] countMatrix = new byte[numberOfLines][numberOfTerms];
int[][] gapsMatrix = new int[numberOfLines][numberOfTerms]; // To big!!
这个列表列表将填充整数,这些整数表示特定文本中同一个单词的两次出现之间的间隙。因此,在计数矩阵中,我保存一个字节,指示是否为指定的索引指定了一个字。然后在我正在创建的函数中,我正在通过countMatrix,如果我在那里找到一个字节,我将当前索引减去最后找到的索引,并将该数字保存在我的2D整数数组中,这给了我正确的文本中每个相同单词之间的间隙。
那么我如何创建一个我需要完成的数据结构呢?
答案 0 :(得分:1)
我不知道这是否适合您,但如果您想坚持使用Array,可以尝试使用Sparse Matrix。还有其他几个选项。Map
,List
,Weak reference Collections
等
答案 1 :(得分:1)
要创建数组,您需要有足够的内存来创建它。
int
每个值使用4个字节,数组至少使用N * M倍。
e.g。 4 * 30383 * 6782大约需要820 MB才能免费创建。
这大约是8美元的内存,所以这应该是一个大问题,除非你没有那么多,或者你设置的最大内存太低。
我会将你的最大内存增加至少1 GB,它应该可以工作。
替代方案包括
char
或short
或byte
,小2-4 x。答案 2 :(得分:0)
你只是没有足够的内存来做到这一点。
http://www.javamex.com/tutorials/memory/array_memory_usage.shtml
对不起,我没说清楚,但是,使用其他DS不大可能会改变这种情况。
答案 3 :(得分:0)
那么我如何创建一个我需要完成的数据结构呢?
如果理解正确,那么您希望记录相同术语之间的差距。 让我们说,您需要分析一系列术语,然后:
String[] terms = ...;
Map<String, List<Integer>> map = new TreeMap<String, <Integer>>();
for (int i = 0; i < terms.length; i++) {
String term = terms[i];
List<Integer> positions = map.get(term);
if (gaps == null) {
positions = new ArrayList<Integer>();
}
positions.add(i);
map.set(term, positions);
}
稍后您只需查看每个术语的位置,并可以计算它们之间的差距。 (您可以将差距计算集成到此代码中,但我将其作为练习留给您)。