如何打印多维数组的所有索引?

时间:2017-09-15 15:00:07

标签: java arrays algorithm data-structures

如果仅给出其维度,则如何打印数组的所有索引。我已经递归地完成了它但是无法在迭代中完成它。我开始但只走了这么远..

public static void print(int[] lengthOfDimension) {

            int[] index = new int[lengthOfDimension.length];
            for (int i = 0; i < lengthOfDimension.length; i++) {
                for (int j = lengthOfDimension.length - 1; j > 0; j--) {
                    for (int m = lengthOfDimension[j] - 1; m > -1; m--) {
                        index[j] = m;
                        for (int l = 0; l < index.length; l++)
                            System.out.print(index[l] + " ");
                        System.out.println();
                    }
                    System.out.println();
                    index[j - 1] = lengthOfDimension[lengthOfDimension.length - i
                            - 1]
                            - i - 1;
                }

                // index[i] = lengthOfDimension[i] - 1;
            }
        }

为这个数组运行我的代码:int a [] = {3,2,3};

它提供以下输出:

0 0 2 
0 0 1 
0 0 0 

0 1 0 
0 0 0 

2 0 2 
2 0 1 
2 0 0 

2 1 0 
2 0 0 

0 0 2 
0 0 1 
0 0 0 

0 1 0 
0 0 0 

预期输出为:

for a[] = {3,2,3}

    0 0 0
    0 0 1
    0 0 2
    0 1 0
    0 1 1
    0 1 2
    1 0 0
    1 0 1
    1 0 2
    1 1 0
    1 1 1
    1 1 2
    2 0 0
    2 0 1
    2 0 2
    2 1 0
    2 1 1
    2 1 2

1 个答案:

答案 0 :(得分:1)

我的理解是,您尝试将所有可能的索引排列生成给定长度的一维数组。

在数组的维度和数组中存储的数据的维度之间的注释中存在一些混淆。例如,<?php $os = $_FILES["pictures"]["error"]; if (in_array("0", $os)) { echo "done"; }else{ echo "error"; } ?> 是一个存储数据的一维数组,可以将其解释为三维空间中的一个点。另一方面,int[] a1 = {3,2,3}声明了一个二维数组。

下面用于生成所有排列的技术非常类似于您在汽车中找到的旧里程表。从最低位置开始,我们将索引递增1并检查它是否应该翻转。如果是这样,我们将其重置为0并继续。如果没有,那么我们有一个新的排列。

这里有一些代码可以说明:

int[][] a2

输出:

public static void main(String[] args)
{
    int a[] = { 3, 2 ,3};
    indexPermutations(a);
}

public static void indexPermutations(int[] arr)
{
    int n = arr.length;
    int[] idx = new int[n];

    while (true)
    {
        System.out.println(Arrays.toString(idx));

        // generate the next permutation
        int i = n-1;
        for (; i >= 0; i--)
        {
            idx[i] += 1;
            if (idx[i] < n) break;                  
            idx[i] = 0;
        }

        // if the first index wrapped around then we're done
        if (i < 0) break;               
    }
}