我想从存储在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开销限制
可能是因为我正在为列表的每个元素重新定义双精度数组(名为temp)。
还有一件事:列表内的数组用作向量,这就是为什么它们是2D数组的原因,尽管它们只有长度为1。
'temp [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[][]
均能很好地工作。这是一个空方法,因为它直接修改了传递的列表,而不进行复制。它制作的唯一副本是列表中每个数组的临时副本。此外,它还可以用于任何列表,而不仅限于ArrayList
。