当前位置: 首页 > 知识库问答 >
问题:

用不同嵌套函数重构重复循环代码

李法
2023-03-14

我有两个for循环,通过一个2D像素数组进行图像操作。

但是,for循环的代码在这些方法中的每个方法中都是重复的。

我有办法把它拔出来吗?

/**
 * Get pixel array from current image.
 */
public void updatePixels() {
    pixels = new int[IMAGE_HEIGHT][IMAGE_WIDTH];
    for (int row = 0; row < IMAGE_HEIGHT; row++) {
        for (int col = 0; col < IMAGE_WIDTH; col ++) {
            pixels[row][col] = image.getRGB(col, row);
        }
    }
}

/**
 * Set pixel array to current image.
 */
public void commitPixels() {
    for (int row = 0; row < IMAGE_HEIGHT; row++) {
        for (int col = 0; col < IMAGE_WIDTH; col ++) {
            image.setRGB(col, row, pixels[row][col]);
        }
    }
}

public void greyscale() {
    updatePixels();
    
    for (int row = 0; row < IMAGE_HEIGHT; row++) {
        for (int col = 0; col < IMAGE_WIDTH; col++) {
            Color currentColour = new Color(pixels[row][col]);
            int r = currentColour.getRed();
            int g = currentColour.getGreen();
            int b = currentColour.getBlue();
            
            int avg = Math.round((float)((r + g + b) / 3));
            pixels[row][col] = new Color(avg, avg, avg).getRGB();
        }
    }
    commitPixels();
}

public void mirror() {
    updatePixels();
    
    int [][] pixelCopy = pixels.clone();
    
    for (int row = 0; row < IMAGE_HEIGHT; row++) {
        for (int col = 0; col < IMAGE_WIDTH; col++) {
            pixels[row][col] = pixelCopy[row][IMAGE_WIDTH - col - 1];
        }
    }
    commitPixels();
}

共有1个答案

宗建章
2023-03-14

从代码来看,updatePixelscommitpixels似乎可以移到greyscalefor循环中

// updatePixel and commitPixel could be made inline as well.
public void updatePixel(int row, int col) {
    pixels[row][col] = image.getRGB(col, row);
}
    

public void commitPixel(int row, int col) {
    image.setRGB(col, row, pixels[row][col]);    
}

public void computeColor(int row, int col) {
    Color currentColour = new Color(pixels[row][col]);
    int r = currentColour.getRed();
    int g = currentColour.getGreen();
    int b = currentColour.getBlue();
                
    int avg = Math.round((float)((r + g + b) / 3));
    pixels[row][col] = new Color(avg, avg, avg).getRGB();
}
    
public void greyscale() {
    pixels = new int[IMAGE_HEIGHT][IMAGE_WIDTH];
    
    for (int row = 0; row < IMAGE_HEIGHT; row++) {
        for (int col = 0; col < IMAGE_WIDTH; col++) {
            updatePixel(row, col);
            computeColor(row, col);
            commitPixel(row, col);
        }
    }       
}

使用这种方法,可以将执行for循环的次数从3次减少到1次。

 类似资料:
  • 我有一个json,包含如下对象数组 在我看来,我想用ngFor呈现json,就像这样 你的名字叫什么? abc 定义 Ghi jkl

  • 本质上,我正在创建自己的字符串类,名为MyString。在这个类中有一个名为getline的函数,它的执行应该和字符串类的getline函数完全一样。 但是经过测试,当函数到达空字符或指定的分隔符时,它似乎不会退出循环,而是不断提示输入,并将该输入添加到已经存在的字符串(c-string)中。 我已经解决了我的上一个问题,但现在我的主服务器在我最后一次getline调用后关闭。

  • 我有一个这样的数组: 中的数组包括另外两个数组(第一个不是必需的,但看看第二个(:这个数组包含不同的 x/y 坐标 ) 我想得到另一个数组的结果,如下所示(解释如下): 数组现在按其 x 值排序 ( -- 我不知道如何编码;这是我到目前为止所拥有的: 编辑:有一点忘记说了,就是应该分组的坐标的不应该大于。看下面的例子:

  • 问题内容: 我有以下for循环: 如何将这个嵌套循环重构为Java 8流? 问题答案: 您可以使用来获取s中所有s的所有:

  • 我正在努力找到确切的答案 我知道外环运行了n次。然后,第二个循环每次运行的次数不同,因为它从i开始: n(n-1)(n-2)。。。2 1. 但是,因为我们只关心最坏的情况(当i=n时),所以第二个循环将运行n-n次,因为它将从i=n开始。这当然没有意义,但这就是我被卡住的地方。我已经运行了这段代码,找到了序列的前四个元素:S=0 1 4 10。。。(其余部分不确定)。 抱歉,如果这不合理,但任何帮