Java 如何将两个FOR合并为一个FOR
这可能很愚蠢,但我想知道这是否可能,让我们从5x5矩阵开始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
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();
}