【问题标题】:Remove row from two dimensional arrays从二维数组中删除行
【发布时间】:2023-03-31 10:55:02
【问题描述】:

我试图从二维数组中删除一行。但是我在google上没有找到有用的东西,我发现的每一个都是关于从ArrayList中删除的。

这是我的二维数组:

int[][] Dirt = {{4, 2}, {0, 5}, {7, 1}, {3, 3}};

例如我想删除 {0,5} 在这里它必须从 Dirt 中删除该行。

for (int z = 0; z < 3; z++) {
    if(pos[0]==Dirt[z][0]&& pos[1]==Dirt[z][1]){
        System.out.println("Dirt[z][0]"+Dirt[z][0] +"Dirt[z][1]"+Dirt[z][1]);
        //here it must remove the row from the Dirt 
    }
}

有什么建议吗?


我试图将数组复制到新的,但也不起作用

这是输出:

[ ][ ][ ][ ][ ][ ][ ][ ] 线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3 [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ]

在 test.Move(test.java:121) 处选择等于 5:4 5:4 nowX 和 nowY 的味道 在 test.main(test.java:149) Java Result: 1 BUILD SUCCESSFUL (total 时间:3秒)

这是我的代码:

int[][] Dirt = {{4, 2}, {0, 5}, {7, 1}, {3, 3}};
int[][] temp = Dirt;
int size = Dirt.length - 1;


public void Move() {
    Collections.shuffle(orientation);
    int nowX = 4, nowY = 4;           
    int counter = 0;
    int strightCounter = 1;
    Dirt = new int[size][2];
    int newIndex = 0;
    int x = 0;
    int y = 0;
    while (!(Dirt.length == 0)) {


        for (int i = 0; i < 3; i++) {
            choices.add(orientation.get(i));

            board[nowX][nowY] = "1";
            int[] pos = gostright(nowX, nowY);
            nowX = pos[0];
            nowY = pos[1];
            System.out.println("" + nowX + ":" + nowY);
            System.out.println("nowX and nowY" + board[nowX][nowY]);
            board[nowX][nowY] = "#";
            moves++;
            for (int z = 0; z < temp.length; z++) {
                int[] oneDimension = temp[z];
                if (pos[0] == oneDimension[0] && pos[1] == oneDimension[1]) {
                             continue;
                }else{           
                    Dirt[newIndex][0] = oneDimension[0];
                    Dirt[newIndex][1] = oneDimension[1];
                    newIndex++;
                }
            }
            System.out.println("The array After removing : ");
            for (int s = 0; s < Dirt.length; s++) {
                System.out.println(Dirt[s][0] + "," + Dirt[s][1]);
            }

            System.out.println(toString());
            System.out.println(orientation.get(i));
            System.out.println("Choices " + choices);
            System.out.println("# move" + moves);
            if (Wall(nowX, nowY)) {
                break;
            }
        }

        counter++;

    }
}


any suggestion ??

【问题讨论】:

  • 我试过这个:但也报错:

标签: java arrays


【解决方案1】:

在 Java 中,数组的大小是静态的,这意味着一旦创建了数组,就无法更改数组的大小。这就是您只找到与 ArrayLists 相关的答案的原因。

【讨论】:

  • 要完成此功能,您可以创建一个 size = size -1 的新数组,然后将相关值(减去已删除的行)复制到新数组中。然后重新分配旧数组以引用新数组。
【解决方案2】:

由于您无法更改数组的大小,因此创建另一个数组并仅插入您需要的元素可能会更好

【讨论】:

    【解决方案3】:

    你正在努力实现一些不可能的事情。

    数组是固定的,所以一旦创建就不能修改它们的大小。

    您可以通过动态创建一个少一行的新数组来创建删除一行的效果。

    【讨论】:

      【解决方案4】:

      您必须用一个新数组替换该数组。这里有 4 行可以做到:

      // original array
      int[][] dirt = { { 4, 2 }, { 0, 5 }, { 7, 1 }, { 3, 3 } };
      int z = 1; // the element to remove
      
      // create a new smaller array
      int[][] dirt2 = new int[dirt.length - 1][];
      // copy everything from 0 to z
      System.arraycopy(dirt, 0, dirt2, 0, z);
      // copy from z+1 to end
      System.arraycopy(dirt, z + 1, dirt2, z, dirt.length - z - 1);
      // reassign
      dirt = dirt2;
      

      【讨论】:

      • 我试过这个,但没有用,给出这个错误:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3
      • @ElfagerElbeaeed 代码是完美的——我用所有有效值(在这个例子中,在 0 到 3 的范围内)对其进行了测试,并且它按预期工作。您只能通过使用数组外部的 z 值来获得该异常 - 在此示例中,数组有 4 个元素,因此 z 的最大有效值是 3,所以如果您使用 @987654325 @(或更大),你会得到那个错误。检查您对该代码的使用情况。
      【解决方案5】:

      Java 数组是不可变对象。
      要删除或添加项目,必须重新生成数组对象。如果要灵活地添加和删除项目,我也建议使用集合对象,如 ArrayList 、 HashMap 等。

      【讨论】:

      • Java 数组不是不可变的。这个大小和类型是固定的,但内容是完全可变的。如果您当然想要更大的灵活性,请同意您关于使用其他集合的建议:-)
      • 感谢 mikera。我对 String 类感到困惑。当然,数组的内容是完全可变的,但字符串不是。 ^^.
      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2010-12-20
      • 2017-11-06
      • 2012-01-21
      • 2015-06-08
      相关资源
      最近更新 更多