相关疑难解决方法(0)

为什么Java没有真正的多维数组?

TL; DR版本,对于那些不想要背景的人,是以下具体问题:

为什么Java没有真正的多维数组的实现?有坚实的技术原因吗?我在这里错过了什么?

背景

Java在语法级别具有多维数组,可以声明

int[][] arr = new int[10][10];
Run Code Online (Sandbox Code Playgroud)

但似乎这真的不是人们所期望的.它不是让JVM分配足够大的连续RAM块来存储100 int秒,而是作为ints 的数组阵列出现:所以每个层都是一个连续的RAM块,但整体而言并非如此.arr[i][j]因此访问速度相当慢:JVM必须这样做

  1. 找到int[]存储的arr[i];
  2. 索引这个找到int存储的arr[i][j].

这涉及查询对象从一层到另一层,这是相当昂贵的.

为什么Java会这样做

在一个层面上,不难看出为什么这不能被优化为简单的扩展和添加查找,即使它们都被分配在一个固定块中.问题是arr[3]它本身就是一个引用,它可以被改变.因此,尽管数组具有固定大小,但我们可以轻松编写

arr[3] = new int[11];
Run Code Online (Sandbox Code Playgroud)

现在,由于这一层已经成长,因此缩放和加载是固定的.您需要在运行时知道是否所有内容仍然与以前相同.此外,当然,这将被分配到RAM中的其他地方(它必须是,因为它比它更换的更大),所以它甚至不适合扩展和添加.

这有什么问题

在我看来,这并不理想,这有两个原因.

首先,它很.我使用这些方法运行的测试用于求和单维或多维数组的内容,对于多维情况(a 和a 分别填充随机值,运行1000000次,温度)几乎是两倍长(714秒对371秒)高速缓存).int[1000000]int[100][100][100]int

public static long sumSingle(int[] arr) {
    long total = 0;
    for (int i=0; i<arr.length; i++)
        total+=arr[i];
    return total;
}

public static long sumMulti(int[][][] arr) {
    long total = 0; …
Run Code Online (Sandbox Code Playgroud)

java arrays performance multidimensional-array

35
推荐指数
4
解决办法
6726
查看次数

在性能方面有什么好处?键入[,]或类型[] []?

在C#中使用二维数组(type[,])或数组()数组会更高效type[][]吗?

特别是对于初始分配和项目访问

c# arrays performance

5
推荐指数
1
解决办法
396
查看次数

"动态分配内存模拟多维数组"的正确术语?

前段时间我问了一个问题,我被告知(在提交中)使用术语"多维数组"作为这样的结构:

int **a;
Run Code Online (Sandbox Code Playgroud)

初始化如下:

a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
    a[i] = malloc(m * sizeof(*a[i]));
Run Code Online (Sandbox Code Playgroud)

是误导,这是"只是一个多维数组的模拟".我不是英语母语人士,我很难搞清楚什么是正确的术语.不幸的是,抱怨这个术语的人自己也没有帮助.

果然,术语"多维阵列的仿真"太长,无法在文本/会话中实际使用.

总结一下:

  • 上面构造的适当术语是什么(特别是在C中,如果有所不同)?

问题:

  • 这种术语语言是否不可知?如果没有,例如在C++中如何调用它?

注意:如果您的答案与参考文献相关联,我会很高兴.
编辑:我理解这个构造和之间的区别int a[n][m];.那不是问题.

更新

分配的内存不一定是常规的.这种结构更精确:

a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
  if (needed[i])
    a[i] = malloc(m[i] * sizeof(*a[i]));
  else
    a[i] = NULL;
Run Code Online (Sandbox Code Playgroud)

c c++ arrays terminology

3
推荐指数
1
解决办法
216
查看次数

FloodFill - 扫雷,需要说明

我正在尝试用Java制作一个类似扫雷的游戏,我已经完成了大部分工作,但我需要帮助的是FloodFill - http://en.wikipedia.org/wiki/Flood_fill.没有真正帮助......但有人可以解释它是如何工作的吗?我看过网上但我并不理解这个解释,所以我会在这里问一下会更容易.

在我的扫雷中,我有:

JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs
int[] mines = new int[100];//int array holding the values for each button.
Run Code Online (Sandbox Code Playgroud)

网格是10x10网格,所以说你点击的按钮是btn [14],

btn[4]  // north of btn[14](14-10)
btn[24] // south of btn[14](14+10)
btn[13] //  west of btn[14](14-1)
btn[15] //  east of btn[14](14+1)
Run Code Online (Sandbox Code Playgroud)

回到这个问题,有人可以向我解释一下吗?

编辑: 我将我的代码更改为2D,而不是上面的代码现在是

btn[1][4]//row one, column 4
Run Code Online (Sandbox Code Playgroud)

单击该按钮时,我希望它检查名为mines [] []的变量,该变量具有值,如果该值等于0(在初始单击的周围),则更改BG

btn[x][y].setBackground(Color.GRAY);
Run Code Online (Sandbox Code Playgroud)

java algorithm flood-fill

1
推荐指数
1
解决办法
3497
查看次数

当一个整数被声明为什么意味着什么?

我在网上做了一个俄罗斯方块教程,并注意到有一个这样的整数声明

int[][][] blah;
Run Code Online (Sandbox Code Playgroud)

为什么整数有3个括号?

java int declaration

0
推荐指数
1
解决办法
133
查看次数