以螺旋顺序打印2D arraylist indexOutOfBounds Exception

时间:2016-04-22 10:57:29

标签: java arrays arraylist indexoutofboundsexception

我正在尝试在Java中以螺旋顺序打印2D arraylist。在任何时候,我通过变量t,b,l,r标记遍历和未遍历的arrayl部分之间的边界(其含义在下面的代码中给出)。变量dir也是我想要遍历的方向。

app.service('getName',function($http){
            return {
                getTheName: function() {
                    return $http({
                        url: 'hello.php',
                        method: 'Post',
                        headers: {
                            'Content-Type': 'application/json'
                        }
                    });
                },
            }
        });

这是我的代码:

dir=0(right),1(down),2(left),3(up).

有人能指出我在哪里弄错了吗? (我得到IndexOutOfBounds异常)

5 个答案:

答案 0 :(得分:1)

不确定我是否理解了您的要求,但我认为这个矩阵:

0, 1, 2, 3, 4, 5
6, 7, 8, 9, 10, 11
12, 13, 14, 15, 16, 17
18, 19, 20, 21, 22, 23
24, 25, 26, 27, 28, 29
30, 31, 32, 33, 34, 35
36, 37, 38, 39, 40, 41

输出是这样的:

0, 1, 2, 3, 4, 5, 11, 17, 23, 29, 35, 41, 40, 39, 38, 37, 36, 30, 24, 18, 12, 6, 7, 8, 9, 10, 16, 22, 28, 34, 33, 32, 31, 25, 19, 13, 14, 15, 21, 27, 26, 20

您的算法有点过于复杂。方向顺序始终相同:向右,向下,向左,向上。所以你可以在不保持目录的情况下一个接一个地编写每个for

public ArrayList<Integer> spiralOrder(final List<ArrayList<Integer>> a) {
    ArrayList<Integer> result = new ArrayList<>();
    int n = a.size();
    int m = a.get(0).size();
    for (int level = 0; level < Math.min(n, m) / 2; level++) {
        for (int i = level; i < m - level - 1; i++) {
            result.add(a.get(level).get(i));
        }
        for (int i = level; i < n - level - 1; i++) {
            result.add(a.get(i).get(m - level - 1));
        }
        for (int i = m - level - 1; i > level; i--) {
            result.add(a.get(n - level - 1).get(i));
        }
        for (int i = n - level - 1; i > level; i--) {
            result.add(a.get(i).get(level));
        }
    }
    return result;
}

答案 1 :(得分:0)

更新变量t,l,r,b时出现小错误。 从左到右处理后,执行t ++一次。目前每次都在使用i进行更新。 更新了以下代码。希望这会有所帮助。

           while(l<=r && t<=b){
                 if(dir==0){
                     for(int i=l; i<=r;i++){
                         result.add(a.get(t).get(i));
                     }
                     dir=1;t++;
                     }

                     else if(dir==1){
                         for(int i=t;i<=b;i++){
                             result.add(a.get(i).get(r));
                         }
                         dir=2;r--;
                     }
                     else if(dir==2){
                         for(int i=r;i>=l;i--){
                             result.add(a.get(b).get(i));
                         }
                         dir=3;b--;
                     }
                     else if(dir==3){
                         for(int i=b;i>=t;i--){ // from bottom to top
                             result.add(a.get(i).get(l));
                         }
                         dir=0;l++;
                     }

             }

答案 2 :(得分:0)

else if(dir==3){
    for(int i=b;i>=b;i++){

我认为应该读取i&gt; = t(从下到上)。如果不是这样,它会查看堆栈跟踪以及哪个数组超出范围

答案 3 :(得分:0)

尝试更改:

else if(dir==3){
    for(int i=b;i>=b;i++){

收件人:

else if (dir==3) {
     for(int i=b; i>=t; i--){

答案 4 :(得分:-1)

else if (dir == 3) {
    for (int i = b; i >= t; i--) {
        result.add(a.get(i).get(l));
        dir = 0;
        l++;
    }
}