嵌套for循环存储到一个数组,只给出一列嵌套循环到数组中

时间:2011-04-12 21:01:07

标签: java multidimensional-array nested-loops

所以,我正在尝试做的是运行1024x768的图片(或者,popMap.getWidth x popMap.getHeight),抓住它的蓝色,将它与目前为止的最高蓝色进行比较,如果更重要的是,蓝色成为新的“新蓝”。基本上,找到图像中最高的蓝色值,最接近255蓝色。

另外,我试图将整个事物的蓝色值存储到一个数组popMapArray中,这是一个包含3列的二维数组,存储[blueValue] [x] [y]。然后我将对其进行排序,以获得最高值的从高到低的列表。

我的问题是,使用下面的代码,它只在列= 767时存储到数组中。

我得到1024 [蓝色,行,767],其余的都是[0,0,0]

有什么线索的原因?顺便说一句,Java。

for (int row = 0;  row < popMap.getWidth(); row++) 
    {
        for (int column = 0; column < popMap.getHeight(); column++)
        {
            System.out.println(column);
            //Find a Pixel
            int c = popMap.getRGB(row, column);
            int red = (c & 0x00ff0000) >> 16;
            //int  green = (c & 0x0000ff00) >> 8;
            //int  blue = c & 0x000000ff;
            // and the Java Color is ...
            Color color = new Color(red); 
            int newBlue = color.getBlue();
            int oldBlue = lastColor.getBlue();
            switch(popArrayRow)
            {
                case 0:
                {
                    arrayVar = newBlue;
                    popArrayRow = 1;
                    break;
                }
                case 1:
                {
                    arrayVar = row;
                    popArrayRow = 2;
                    break;
                }
                case 2:
                {
                    arrayVar = column;
                    popArrayRow = 0;
                    break;
                }
            }
            popArray[row][popArrayColumn] = arrayVar;
            //System.out.println(popArray[row][popArrayColumn]);
            switch(popArrayColumn)
            {
                case 0:
                {
                    popArrayColumn = 1;
                    break;
                }
                case 1:
                {
                    popArrayColumn = 2;
                    break;
                }
                case 2:
                {
                    popArrayColumn = 0;
                    break;
                }
            }


            if(newBlue > oldBlue)
            {
                startX = row;
                startY = column;
                //System.out.print(row);
                //System.out.print(",");
                //System.out.println(column);
                System.out.print("The oldBlue is ");
                System.out.println(oldBlue);
                lastColor = color;
            }



        }
    } 

2 个答案:

答案 0 :(得分:1)

int red = (c & 0x00ff0000) >> 16;
        //int  green = (c & 0x0000ff00) >> 8;
        //int  blue = c & 0x000000ff;
        // and the Java Color is ...
        Color color = new Color(red); 
       int newBlue = color.getBlue();

你的意思是“颜色=新颜色(c)”?您的newBlue值将始终为0 ...

另外,你究竟想用popArray构造做什么?让你的状态变量每个像素调整一次可能无法完成你想要的...听起来你想要一个SortedMap<int,Point>,键入blueValue,其值是点的x,y坐标(存储为数组或Point对象)。然后你就拥有了你的数据结构,按蓝色值排序,你可以直接读取你的分数。

祝你好运!

答案 1 :(得分:0)

你没有显示声明go popArray(以及我假设的一些其他变量是初始化为0的整数)。您将其描述为“具有3列的2d数组”。我猜你已经宣布它为int[1024][3],所以它在popMap中每行有一行,然后你的3“列”用于存储蓝色值,即原始x坐标,和原始的y坐标。

首先,目前还不清楚您希望如何为原始图像中的每个像素在此数组中存储一个条目。但也许我猜你是怎么宣布这是错误的。

在任何情况下,每次通过内循环你基本上都要设置

popArray[currentPixel] = {blueValue, origX, origY}

但是每次循环时只分配三个值中的一个。所以你正在做类似

的事情
popArray[0][0] = blueValue //first iteration; blueValue from row 0 col 0
popArray[0][1] = 0 //second iteration; row from row 0 col 1
popArray[0][2] = 2 //third iteration; column from row 0 col 2

所以希望你已经可以看到出现问题,因为你正在填充“列”,这些列应该与来自循环的不同迭代的值一起使用。更糟糕的是,然后在内循环的下一次迭代中重写这些值(在row增量之前将迭代总共768次):

popArray[0][0] = blueValue // fourth iteration; blueValue from row 0 col 4; overwrite value assigned on first iteration
etc...

不是使用具有不同含义的3个数组“列”来保存这些数据元素,而是建立一个包含三个值的类并明确它是什么是明智的。 popArray将包含此对象类型。此外,我会将其设为List而不是数组,因为它更灵活,您可以在最后调用Collections.sort();或@jsegal有一个很好的建议,即使用在插入项目时进行排序的数据结构。哪一个更好可能取决于你以后想要做什么。