遍历n维数组

4

我怎样可以遍历一个n维数组(n是未知的)?

我在C++中找到了通过运行数组的内存区域来完成遍历的结果,但我不知道在JAVA中是否可以这样做。


什么是“可变维数组”? - Andremoniy
我不确定我是否理解了你的问题,但是我会尝试回答:我有一个向量在N^n中,其中每个条目的取值范围从0到xn。然而,我事先不知道n的大小,我需要一种遍历所有可能向量的方法。 - dcferreira
嗨,@user2270119,按照惯例,选择适合您问题的答案打勾是被认为是必要的。 - d'alar'cop
3个回答

2
我在其他地方找到了这个解决方案。它是一个相当不错的递归解决方案,可以解决您的问题:
 interface Callback {
       void visit(int[] p); // n-dimensional point
    }

void visit(int[] bounds, int currentDimension, int[] p, Callback c) {
   for (int i = 0; i < bounds[currentDimension]; i++) {
        p[currentDimension] = i;
        if (currentDimension == p.length - 1) c.visit(p);
        else visit(bounds, currentDimension + 1, p, c);
   }
}

visit(new int[] {10, 10, 10}, 0, new int[3], new Callback() {
   public void visit(int[] p) {
        System.out.println(Arrays.toString(p));
   }
});

2
这可能符合您的需求:
public interface ElementProcessor {    
    void process(Object e);    
}

public static void iterate(Object o, ElementProcessor p) {
    int n = Array.getLength(o);
    for (int i = 0; i < n; i++) {
        Object e = Array.get(o, i);
        if (e != null && e.getClass().isArray()) {
            iterate(e, p);
        } else {
            p.process(e);
        }
    }
}

然后,在调用时:

// the process method will be called on each element of the n-dimensional
ElementProcessor p = new ElementProcessor() {
    @Override
    public void process(Object e) {
        // simply log for example
        System.out.println(e);
    }
};

int[] a1 = new int[] { 1, 2 };
int[][] a2 = new int[][] { new int[] { 3, 4 }, new int[] { 5, 6 } };

iterate(a1, p);
iterate(a2, p);

这将打印:

1
2
3
4
5
6

这看起来不错,似乎是个好的解决方案,但我更关心效率,一般来说递归并不是最佳选择。真的没有其他方法吗?(我想不出其他方法) - dcferreira
@user2270119 经过尝试了几种方法,我没能找到其他不使用递归的解决方案...恐怕你别无选择。但如果你找到了其他解决方案,请告诉我 :) - sp00m

1
在C/C++中,多维数组(int[][])以平面方式表示在内存中,索引运算符被转换为指针算术运算。这就是为什么在这些语言中很容易和直接进行的原因。
然而,在Java中情况并非如此,多维数组是数组的数组。由于类型是严格检查的,对数组进行索引会产生一个数组类型作为结果,而不是内部数组所包含的类型。
因此,回答问题:在Java中不能像在C/C++中那样简单地做到这一点。
要做到这一点,请参见其他答案.. :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接