JAVA中矩形排列数据解析成二维数组

时间:2014-11-20 05:31:40

标签: java arrays parsing

我一直在解决这个问题,目前缺乏如何解析分成数据方块的小片段到二维数组中的数字数据的想法。数据以矩形形式排列(假设与文件/文本文件中的相似)。数据看起来与下面提供的图片类似,数值可以完全随机,因此无关紧要。我需要解析所有可能的正方形(红色,蓝色和绿色突出显示的是一个示例),可以在该矩形中找到方形对象数组。

我面临的问题是找出在这个矩形中读取所有可能的方形组合并正确地将它们写入控制台的方法。 (我确信如果我能够正确地阅读并将它们打印到控制台,我就不会在存储数据方面遇到太多麻烦。)。我一直在考虑如何以多种方式做到这一点,但不幸的是,所有这些尝试和思考都没有在我的脑海中正确地点击。我不确定我的想法是否会对你有任何帮助,但这是我在解决这个解析问题时的悲惨尝试的片段。我试图在控制台上打印至少3x3的方块,这些方块可以在矩形内找到(矩阵/ 2D数组 - 你可以命名)。如果有人能帮我弄清楚如何阅读和打印可以在该矩形中找到的所有可能的正方形,那就太棒了。

编辑:由于网站限制我无法发布图片,因此我将离开链接:

Data Image

EDIT2:我也注意到绿色突出显示的方块由于实际上不是正方形而不正确,请忽略它,请原谅我带来的不便和可能造成的混淆。

public static void main(String[] args){
    int[][] rectangle = {
            {4, 9, 6, 2, 6},
            {3, 5, 1, 6, 4},
            {8, 1, 5, 6, 2},
            {1, 1, 6, 2, 2}
            }; 
    int m = 5; // row length
    int n = 4; // column length
    int min = 3; // minimum square row/column length for iteration
    int start = 0;
    int step =  0;
    for (int x = 0; x < n-1; x++){
        for(int y = start;  y < m-1; y++){
            if (y < min){ // no idea how to make this part work
                System.out.print(rectangle[x][y] + " ");
                step++;
            }
            if(Math.pow(min, 2) == step && x != n - 1){
                // once here save the square, initialize new one;
                System.out.println("");
                step = 0;
                start++;
                y = start;
                x++;
            }
            // all squares have been read in x-th column, moving more to the right
            if( x == n - 1 && y == min - 1 && x != y){
                y = start + 1;
                x = 0;
            }
        }
        System.out.println(" ");
    }

}

1 个答案:

答案 0 :(得分:0)

此算法的工作原理如下:

  • 确定给定rectengle中可以是正方形左上角的所有点
  • 对于每一个都确定所有可能的尺寸,以便完整的正方形在矩形
  • 使用新发现的方块(在这种情况下打印两个反角)进行处理

    int[][] rectangle = {
            {4, 9, 6, 2, 6},
            {3, 5, 1, 6, 4},
            {8, 1, 5, 6, 2},
            {1, 1, 6, 2, 2}
            }; 
    int m = 5; // row length
    int n = 4; // column length
    int min = 3; // minimum square row/column length for iteration
    
    //Take all possible upper-left-hand-corners
    for(int row = 0; row <= n - min; row++){
        for(int column = 0; column <= m - min; column++){
            //Determine all possible square sizes from that corner
            for(int size = min; size <= n - row && size <= m - column; size++){
                //This will print the upper-left-hand-corner 
                //and the lower-right-hand-corner as (x|y)
                //Place here anything that you want to do with the squares
                System.out.println("(" + column + "|" + row + ") to (" 
                    + (column+size-1) + "|" + (row+size-1) + "), size: " + size);
            }
        }
    }
    

关于n和m的一个注释:您可能不想对矩形的尺寸值进行硬编码。相反,您可能想要使用:

int m = rectangle[0].length;
int n = rectange.length;