Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将两个FOR合并为一个FOR_Java - Fatal编程技术网

Java 如何将两个FOR合并为一个FOR

Java 如何将两个FOR合并为一个FOR,java,Java,这可能很愚蠢,但我想知道这是否可能,让我们从5x5矩阵开始 int[][] x = new int[5][5]; Random rg = new Random(); 现在让我们用伪随机信息填充它 for(int i=0;i<5;i++){ for(int j =0; j<5;j++){ x[i][j] = rg.nextInt(); } } for(int i=0;i您需要从单个索引计算行和列,然后: for(i

这可能很愚蠢,但我想知道这是否可能,让我们从5x5矩阵开始

int[][] x = new int[5][5];      
Random rg = new Random();
现在让我们用伪随机信息填充它

for(int i=0;i<5;i++){
    for(int j =0; j<5;j++){
        x[i][j] = rg.nextInt(); 
    }           
}

for(int i=0;i您需要从单个索引计算行和列,然后:

for(int i = 0; i < 5 * 5; i++)
{
   int row = i / 5;
   int column = i % 5;
   x[row][column] = rg.nextInt();
}
应该清楚的是,对于第一行中的任何值,该值除以5就是行索引本身,即它们都是0。

intq=5,r=5;
 int q = 5, r= 5;
 int [][] x = new int [q][r]

for(int i = 0; i < q * r; i++)
{
    int xaxis = i / q;
    int yaxis = i / r;

    x[xaxis][yaxis] = rg.nextInt();
}
int[]x=新的int[q][r] 对于(int i=0;i
虽然我不知道你为什么想…你仍然有相同的迭代次数
这更难阅读,需要更多的数学计算才能运行,所以如果你对它进行分析,它可能会慢一些。另一种方法是:

int i,j;
for (i=0,j=0; i<5 && j<5; i = (i==4 ? 0 : i+1), j = (i==4 ? j+1 : j))
{
   x[i][j] = rg.nextInt();
}
inti,j;

对于(i=0,j=0;i你真的不会从中得到任何好处。让你的代码保持可读性。实际上更密集的是将建议的乘法和除法展开到一个循环中。(乘法和除法实际上是ALU中的一组复杂指令)

我很好奇,做了一个基准测试

对于Linux上的Suns HotSpot 64服务器jvm,嵌套循环和展开循环的速度大致相同,几乎与迭代[size*size]的线性数组的速度一样快。展开循环实际上比嵌套循环快,可能是因为它做了更多的数学运算

但是,在Windows上的IBMs jdk 1.5 32位上,嵌套循环的速度要慢10倍以上

不过,我不确定在这种情况下,编译器还是jvm才是重要的,较慢的测试是使用IBMs RAD wich编译的,它比Eclipse3.4早了一年


因此,如果您停留在一个带有旧jvm和and编译器的“企业”平台上,而这确实是一个时间关键性的问题,那么用这些优化来打乱代码的唯一原因就是。

一旦热点编译器运行几次嵌套循环,嵌套循环将非常快。。 请参阅。

最短解

int i = 0,j=0;
 for(;j<5;j+=i==4?1:0,i++){
    if(i==5)
       i=0;
    x[j][i] = rg.nextInt();

  }
inti=0,j=0;

对于(;jHowever,我认为它不会比2-for叠瓦版本快,它仍然是O(n²)复杂度。@Bishiboosh:不,我也不认为它更快……从来没有说过它会更快,只是想展示如何使用单个循环,就像最初的问题一样。有时,在C中,指针算法比数组反引用更快,因此这可能是有用的。但这是没有意义的,因为过早优化是所有错误的根源=)如果您想让它运行得更快,可以使用单个数组。Chii:现在有相当好的优化编译器(尽管删除边界检查很棘手)。对于华丽的ASCII艺术,还有一个+1:)在单for循环中进行此操作的目的是什么?无论是在单for循环中还是在嵌套循环中,都必须迭代X*Y次。我认为嵌套循环可读性更好。我知道两个循环是更快、更好、可读的方式,但我对这种方式感兴趣。感谢所有的快速回答。这不起作用:(1)对于使用“;”作为分隔符,而不是“,”(2)它仅适用于q==r;如果q
int i,j;
for (i=0,j=0; i<5 && j<5; i = (i==4 ? 0 : i+1), j = (i==4 ? j+1 : j))
{
   x[i][j] = rg.nextInt();
}
int i = 0,j=0;
 for(;j<5;j+=i==4?1:0,i++){
    if(i==5)
       i=0;
    x[j][i] = rg.nextInt();

  }