java - 删除二维数组中的行的最快方法

标签 java arrays optimization arraylist clone

我有一个程序,需要从 byte[][] 数组中删除一组行。我想删除其中没有零的每一行。现在我正在使用以下方法:

public byte[][] checkRows(byte[][] grid) {
    LinkedList<Integer> temp = new LinkedList<Integer>();
    boolean willRemove = false;
    for (int y = 0; y < grid.length; y++) {
        boolean tempCheck = true;
        for (int x = 0; x < grid[0].length; x++) {
            if (grid[y][x] == 0) {
                tempCheck = false;
                break;
            }
        }
        if (tempCheck) {
            temp.add(y);
            willRemove = true;
        }
    }

    if (willRemove) {
        int[] rowArray = convert(temp);
        return removeRows(grid, rowArray);
    }
    return grid;

}

public byte[][] removeRows(byte[][] grid, int[] rows) {
    int total = rows.length;
    int current = 0;
    byte[][] retGrid = new byte[grid.length][grid[0].length];
    for (int i = total; i < grid.length; i++) {
        if (current < total && i-total+current == rows[current]) {
            current++;
        }
        //retGrid[i] = grid[i-total+current].clone();
        System.arraycopy(grid[i-total+current], 0, retGrid[i], 0, xsize);

    }
    return retGrid;
}

public int[] convert(LinkedList<Integer> intList) {
    int[] retArray = new int[intList.size()];
    for (int i = 0; i < retArray.length; i++) {
        retArray[i] = intList.get(i).intValue();
    }
    return retArray;
}

这为我提供了一种相当快速的方法,可以从二维数组中删除行并用数组顶部的零行替换它们。有没有更快的方法来达到相同的结果?

如果不清楚该脚本的作用,它是为了删除俄罗斯方 block 游戏中的整行。

更新:使用 System.arraycopy() 代替 clone() 可为小型数组提供 5% 的性能提升。

最佳答案

使用链表会产生 O(1) 删除操作,请参阅 this answer ,因为无论如何都必须迭代列表。

起初我认为多维数组是紧凑的,因为它是一个连续的内存块,但是 it seems不是这种情况。因此,您不会失去任何可能已经生效的缓存优势。

遗憾的是,Java 没有值类型(当前),我会使用值类型而不是字节来编码信息。嗯,这并不是绝对必要的......

从代码审查的角度来看,在方法 checkRows 中使用 bool willRemove 是不必要的,因为在这些情况下,temp 将具有超过一个元素。如果不需要的话,我会尝试完全消除 ArrayList 分配 - 推迟它。

关于java - 删除二维数组中的行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401482/

相关文章:

java - 对并行 Java 程序进行单元测试

java - 为什么我们需要在 Guice 模块中实现configure()?

asp.net - 我可以使用 ASP.NET 提前刷新缓冲区吗?

c++ - 如何使用指针访问动态结构数组的成员?

Javascript 将字符串变量作为数组访问

java - 在 JTS 中联合几何更快?

c++ - 如何优化路径列表中的目录列表?

java - Spring Boot 应用程序无法使用 SSH 启动

Spark 中的 Java 8 流开销

javascript - 尝试从 $.getJSON() 的多个源形成回调结果数组