Java for 循环,同时将变量保持在一个范围内

标签 java loops for-loop nested iteration

我尝试运行两个 for 循环,迭代诸如彩色大正方形(例如 300x300)之类的东西,并将其替换为较小正方形(例如 100x100)的颜色(或像素),这就是 k 和 l 所代表的。

本质上,我想知道如何保持 k 和 l 在 0-100 之间运行,并在达到 100 后重新启动,同时又保持 i 和 j 始终运行。我尝试使用 4 个嵌套 for 循环,但它无法正常工作,尽管我开始认为这可能是一个解决方案,但效率非常低。

如果这听起来有点令人困惑,请告诉我,我会尽力解释得更清楚,谢谢。

请原谅伪代码

for (i=0; i < width; i++)
        for (j=0; i< height; j++)
           set(i, j , pixel(k,l));

最佳答案

问题似乎是将一个图像平铺到另一个图像上。您有目标图像尺寸的 widthheight,因此假设 sourceWidthsourceHeight 是源图像的尺寸(在您的示例中为 100 x 100)。

要平铺图像,您需要 k == i % sourceWidthl == j % sourceHeight,以便从源图像读取的像素“包裹”围绕”的边界。这些应该是invariant conditions 。满足它们的最简单方法是直接这样声明它们:

for(int i = 0; i < width; ++i) {
    int k = i % sourceWidth;
    for(int j = 0; j < height; ++j) {
        int l = j % sourceHeight;
        set(i, j, pixel(k, l));
    }
}

这会执行大量 % 操作,效率可能相当低,但它为我们提供了一段正确的代码进行转换。如果我们递增 kl,则需要两个属性来维持不变量:

  1. ki 一致递增; lj 一致递增。
  2. k达到sourceWidth时,它必须回绕到0,对于lsourceHeight也是如此。<
for(int i = 0, k = 0; i < width; ++i, ++k) {
    if(k == sourceWidth) { k = 0; }
    for(int j = 0, l = 0; j < height; ++j, ++l) {
        if(l == sourceHeight) { l = 0; }
        set(i, j, pixel(k, l));
    }
}

请注意,for 循环初始化器和步进器现在为两个循环声明和更新两个变量。 Java 中允许这样做。

这可能比执行大量 % 操作更快,但请注意使用 if 语句进行分支 can also slow down an algorithm ,因此您可能需要对其进行基准测试以确保确定。

在源图像的尺寸为 2 的幂的特殊情况下,我们可以通过快速按位运算获得相同的结果:i % sourceWidth 将相当于 i & (sourceWidth - 1):

// special case: sourceWidth and sourceHeight are powers of 2
int wMask = sourceWidth - 1, hMask = sourceHeight - 1;
for(int i = 0, k = 0; i < width; ++i, ++k) {
    for(int j = 0, l = 0; j < height; ++j, ++l) {
        set(i, j, pixel(i & wMask, j & hMask));
    }
}

关于Java for 循环,同时将变量保持在一个范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59024969/

相关文章:

java - 多次迭代列表的性能成本是多少

java - 哪个是最优的?

python - 循环获取两条用户输入并保存到全局列表

c++ - C++ 的其他循环选项

java - 如何制作 Javafx 图像裁剪应用

java - Android致命异常错误

java - 如何在 Java 中使用自定义字体?

java - 如何避免在 Java 中重复 for 循环?

python - 如何迭代此列表以创建矩阵?

c - C 编程中带有 "struct"的 "for-loop"对象