【发布时间】:2015-04-19 13:33:40
【问题描述】:
我用 Java 编写了一个复杂的程序,我需要管理许多包含整数值的大型稀疏矩阵。 示例:
int A[][][][];
int B[][][];
int C[][];
为了节省内存、空间等,我决定将这些数据存储在 TreeMap 中。我知道存在很多做得更好的库,但我会尝试实施我的个人解决方案。 首先,我创建了一个类 Index 来标识这个数组的索引而不知道它们有多少。
public class Index implements Comparable<Index> {
private final int[] index;
public Index(int ... index) {
this.index = index;
}
@Override
public int toCompare(Index i) {
...
}
}
显然我已经使用这个类以这种方式定义我的三个地图:
Map <Index, Integer> mapA = new TreeMap <> ();
Map <Index, Integer> mapB = new TreeMap <> ();
Map <Index, Integer> mapC = new ...
现在,我需要将之前创建的矩阵中的数据存储到这些地图中。最简单的方法是使用 4/3/2/.. 循环,但我很乐意接受其他解决方案。
for(int s = 0; s < s_max; s++) {
for(int c = 0; c < c_max; c++) {
for(int o = 0; o < o_max; o++) {
for(int d = 0; d < d_max; d++) {
mapA.put(new Index(s,c,o,d), A[s][c][o][d]);
}
}
}
}
问题的重点是我需要检索数据的时候,但让我解释一下。这些映射之间更常见的操作是将它们视为矩阵或数组的乘法和加法。每次我需要执行如下操作时,我都无法创建 6(..) 个嵌套循环(我无法插入图像,因为我的声誉仍然很低):
http://postimg.org/image/7m8v0kiwn/
我的问题是:
- 如何从键中过滤我的值?
- 有办法(可能使用 lambda 表达式)来执行这种类型的操作吗?
- 关于这个问题有什么建议吗?
【问题讨论】:
-
为什么您认为将数组复制到 TreeMap 会节省内存?此外,使用数组作为映射的键没有意义,因为数组是使用不覆盖等号和哈希码的动态类创建的,因此除非您具有对原始数组的引用,否则您无法在映射中找到某些东西是用作键。
-
你需要更清楚你的问题,你当前的解决方案,你为什么要这样做,以及你当前的解决方案有什么问题。
-
@bot 数组是稀疏的,所以使用不同的结构可以节省内存。
-
我选择了 TreeMap 而不是 HashMap,因为我读到第二个在计算巨大数组中的哈希方面更昂贵。您可以在下面找到的文章讨论了 Trie(而不是 HashMap),我认为树状结构可能比哈希状结构更好。
来自:stackoverflow.com/questions/390181/…
标签: java dictionary lambda java-8 sparse-matrix