4

如何迭代 n 维数组(n未知)?

我发现 C++ 的结果可以简单地通过数组的内存区域运行,但我不知道我是否可以在 JAVA 中做到这一点。

4

3 回答 3

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
于 2013-04-11T13:00:12.113 回答
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));
   }
});
于 2013-04-11T11:57:15.450 回答
1

在 C/C++ 中,多维数组 ( int[][]) 在内存中以平面方式表示,并且索引运算符被转换为指针算术。这就是为什么在这些语言中做到这一点很容易和直接的原因。

然而这不是Java中的情况,多维数组是数组的数组。由于类型经过严格检查,因此在数组数组中进行索引会产生数组类型,而不是内部数组包含的类型。

所以回答这个问题:不,你不能在 Java 中像在 C/C++ 中那样简单地做到这一点

为此,请参阅其他答案.. :-)

于 2013-04-11T12:00:49.333 回答