我想从每个 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/