通过二维阵列对角循环

 Vicki大毛美国代购 发布于 2023-02-12 15:01

我写了下面的代码来走一半数组的对角线:

String[][] b = [a,b,c]
               [d,e,f]
               [g,h,i];  

public void LoopDiag()
   for (int i = b.length - 1; i > 0; i--) {
       String temp = "";
       for (int j = 0, x = i; x <= b.length - 1; j++, x++) {
          temp = temp+b[x][j];
       }
       System.out.println(temp)
   }


   for (int i = 0; i <= b.length - 1; i++) {
        String temp = "";
        for (int j = 0, y = i; y <= b.length - 1; j++, y++) {
        temp = temp+b[j][y];
        }
        System.out.println(temp);
   }
}

现在它打印对角线即电流输出:

g dh aei bf c

如何使其打印另外的半对角线,即所需的输出:

a db gec hf i 

Nicolai.. 16

仅为测试目的初始化数组:

    int dim = 5;
    char ch = 'A';
    String[][] array = new String[dim][];
    for( int i = 0 ; i < dim ; i++ ) {
        array[i] = new String[dim];
        for( int j = 0 ; j < dim ; j++, ch++ ) {
            array[i][j] = "" + ch;
        }
    }

输出我们的矩阵:

    for( int i = 0 ; i < dim ; i++ ) {
        for( int j = 0 ; j < dim ; j++, ch++ ) {
            System.out.print( array[i][j] + " " );
        }
        System.out.println();
    }
    System.out.println( "============================" );

来自对角线的元素索引有一个规则 - 它们的总和在一个对角线上是恒定的:

变体1

使用两个循环来提取所有对角线.

第一个循环提取对角线的上半部分:

    for( int k = 0 ; k < dim ; k++ ) {
        for( int j = 0 ; j <= k ; j++ ) {
            int i = k - j;
            System.out.print( array[i][j] + " " );
        }
        System.out.println();
    }

第二个循环遍历对角线的下半部分:

    for( int k = dim - 2 ; k >= 0 ; k-- ) {
        for( int j = 0 ; j <= k ; j++ ) {
            int i = k - j;
            System.out.print( array[dim - j - 1][dim - i - 1] + " " );
        }
        System.out.println();
    }

变体2

使用一个循环来提取所有对角线,但还有额外的迭代一个额外的检查:

    for( int k = 0 ; k < dim * 2 ; k++ ) {
        for( int j = 0 ; j <= k ; j++ ) {
            int i = k - j;
            if( i < dim && j < dim ) {
                System.out.print( array[i][j] + " " );
            }
        }
        System.out.println();
    }

输出:

A B C D E 
F G H I J 
K L M N O 
P Q R S T 
U V W X Y 
============================
A 
F B 
K G C 
P L H D 
U Q M I E 
V R N J 
W S O 
X T 
Y 
更新

在评论中有关于矩形矩阵(高度!= 宽度)的问题.这是矩形矩阵的解决方案:

规则保持不变:来自同一对角线的元素索引的总和是不变的

索引的最小总和为0(对于索引为[0; 0]的矩阵中的第一个元素)

索引的最大总和是width + height - 2(对于矩阵中的最后一个元素,索引为[height-1; with-1])

初始化矩形矩阵仅用于测试目的:

    int WIDTH = 7;
    int HEIGHT = 3;
    char ch = 'A';
    String[][] array = new String[HEIGHT][];
    for( int i = 0 ; i < HEIGHT ; i++ ) {
        array[i] = new String[WIDTH];
        for( int j = 0 ; j < WIDTH ; j++, ch++ ) {
            array[i][j] = "" + ch;
        }
    }

打印我们的矩形矩阵:

    for( int i = 0 ; i < HEIGHT ; i++ ) {
        for( int j = 0 ; j < WIDTH ; j++, ch++ ) {
            System.out.print( array[i][j] + " " );
        }
        System.out.println();
    }
    System.out.println( "============================" );

    for( int k = 0 ; k <= WIDTH + HEIGHT - 2; k++ ) {
        for( int j = 0 ; j <= k ; j++ ) {
            int i = k - j;
            if( i < HEIGHT && j < WIDTH ) {
                System.out.print( array[i][j] + " " );
            }
        }
        System.out.println();
    }

输出:

A B C D E F G 
H I J K L M N 
O P Q R S T U 
============================
A 
H B 
O I C 
P J D 
Q K E 
R L F 
S M G 
T N 
U 


alex.. 5

自助一下,看看您需要遍历的索引:

#1 (0,0)               -> a
#2 (1,0)  (0,1)        -> bd
#3 (2,0)  (1,1)  (0,2) -> gec
#4 (2,1)  (1,2)        -> hf
#5 (2,2)               -> i

查看每次迭代中索引的变化,然后创建算法。没那么困难,所以自己动手做吧;)

2 个回答
  • 自助一下,看看您需要遍历的索引:

    #1 (0,0)               -> a
    #2 (1,0)  (0,1)        -> bd
    #3 (2,0)  (1,1)  (0,2) -> gec
    #4 (2,1)  (1,2)        -> hf
    #5 (2,2)               -> i
    

    查看每次迭代中索引的变化,然后创建算法。没那么困难,所以自己动手做吧;)

    2023-02-12 15:03 回答
  • 仅为测试目的初始化数组:

        int dim = 5;
        char ch = 'A';
        String[][] array = new String[dim][];
        for( int i = 0 ; i < dim ; i++ ) {
            array[i] = new String[dim];
            for( int j = 0 ; j < dim ; j++, ch++ ) {
                array[i][j] = "" + ch;
            }
        }
    

    输出我们的矩阵:

        for( int i = 0 ; i < dim ; i++ ) {
            for( int j = 0 ; j < dim ; j++, ch++ ) {
                System.out.print( array[i][j] + " " );
            }
            System.out.println();
        }
        System.out.println( "============================" );
    

    来自对角线的元素索引有一个规则 - 它们的总和在一个对角线上是恒定的:

    变体1

    使用两个循环来提取所有对角线.

    第一个循环提取对角线的上半部分:

        for( int k = 0 ; k < dim ; k++ ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                System.out.print( array[i][j] + " " );
            }
            System.out.println();
        }
    

    第二个循环遍历对角线的下半部分:

        for( int k = dim - 2 ; k >= 0 ; k-- ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                System.out.print( array[dim - j - 1][dim - i - 1] + " " );
            }
            System.out.println();
        }
    

    变体2

    使用一个循环来提取所有对角线,但还有额外的迭代一个额外的检查:

        for( int k = 0 ; k < dim * 2 ; k++ ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                if( i < dim && j < dim ) {
                    System.out.print( array[i][j] + " " );
                }
            }
            System.out.println();
        }
    

    输出:

    A B C D E 
    F G H I J 
    K L M N O 
    P Q R S T 
    U V W X Y 
    ============================
    A 
    F B 
    K G C 
    P L H D 
    U Q M I E 
    V R N J 
    W S O 
    X T 
    Y 
    

    更新

    在评论中有关于矩形矩阵(高度!= 宽度)的问题.这是矩形矩阵的解决方案:

    规则保持不变:来自同一对角线的元素索引的总和是不变的

    索引的最小总和为0(对于索引为[0; 0]的矩阵中的第一个元素)

    索引的最大总和是width + height - 2(对于矩阵中的最后一个元素,索引为[height-1; with-1])

    初始化矩形矩阵仅用于测试目的:

        int WIDTH = 7;
        int HEIGHT = 3;
        char ch = 'A';
        String[][] array = new String[HEIGHT][];
        for( int i = 0 ; i < HEIGHT ; i++ ) {
            array[i] = new String[WIDTH];
            for( int j = 0 ; j < WIDTH ; j++, ch++ ) {
                array[i][j] = "" + ch;
            }
        }
    

    打印我们的矩形矩阵:

        for( int i = 0 ; i < HEIGHT ; i++ ) {
            for( int j = 0 ; j < WIDTH ; j++, ch++ ) {
                System.out.print( array[i][j] + " " );
            }
            System.out.println();
        }
        System.out.println( "============================" );
    

        for( int k = 0 ; k <= WIDTH + HEIGHT - 2; k++ ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                if( i < HEIGHT && j < WIDTH ) {
                    System.out.print( array[i][j] + " " );
                }
            }
            System.out.println();
        }
    

    输出:

    A B C D E F G 
    H I J K L M N 
    O P Q R S T U 
    ============================
    A 
    H B 
    O I C 
    P J D 
    Q K E 
    R L F 
    S M G 
    T N 
    U 
    

    2023-02-12 15:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有