java - 有效地删除 Java 中 arraylist 中每个数组的第一个元素

标签 java arrays arraylist out-of-memory

我想从每个 double[][] 中删除第一个元素存储在 ArrayList<double[][]> 中的数组.该列表存储了大量数据(60000 个元素)。

我尝试使用以下代码来实现这一点:

public ArrayList<double[][]> correctInput(ArrayList<double[][]> input) {
    double[][] temp;
    ArrayList<double[][]> correctedinput = new ArrayList<>();

    for (int n = 0; n < input.size(); n++) {
        temp = new double[input.get(0).length - 1][1];

        for (int i = input.get(n).length - 1; i > 0; i--) {
            temp[i - 1][0] = input.get(n)[i][0];
        }

        correctedinput.add(temp);
    }

    return correctedinput;
}

虽然我的代码适用于较小的列表,但当尝试在大列表中使用它时,它会导致

java.lang.OutOfMemoryError: GC Overhead Limit Exceeded

可能是因为我正在为列表的每个元素重新定义 double 组(名为 temp)。 还有一件事:列表中的数组用作 vector ,这就是为什么它们是二维数组的原因,尽管它们的长度仅为 1。

'温度[0].lenght = 1'

问题是我如何让这个对于非常大的列表更有效地运行。
任何类型的提示都将不胜感激。

最佳答案

试试这个方法:

Java 8+

public static <T> void remove1stArrayElementFromEveryElement(List<T[]> list) {
    list.replaceAll(array -> Arrays.copyOfRange(array, 1, array.length));
}

Java 7+

public static <T> void remove1stArrayElementFromEveryElement(List<T[]> list) {
    for (ListIterator<T[]> iter = list.listIterator(); iter.hasNext(); ) {
        T[] array = iter.next();
        array = Arrays.copyOfRange(array, 1, array.length);
        iter.set(array);
    }
}

我把它变成了通用的,所以它与 double[][]int[][] 一样工作得很好。这是一个 void 方法,因为它直接修改传递的列表,而不进行复制。它制作的唯一副本是列表中每个数组的临时副本。此外,它适用于任何列表,而不仅仅是 ArrayList

关于java - 有效地删除 Java 中 arraylist 中每个数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51880667/

相关文章:

java - 如何在 Java 应用程序服务器中创建自定义对象池

javascript - 如何根据子字段的值对对象数组进行排序?

java - 使用 jsonpath 表达式的数组大小 - Stefan Goessner JsonPath

PHP 从 mysqli_fetch_row 数组中排序结果

Java 对象数组 Foreach 方法访问

java - 字符串的 ArrayList 到一个字符串

java - 使用 Spring Task Scheduler 时无法 Autowiring DAO

java - JSch 未将完整文件上传到远程 SFTP 服务器,仅上传部分文件

Java - 计算存储在数组中的成绩平均值+打印低于平均值的成绩

java - 由各种类型的对象组成的ArrayList