我需要删除数组points
中的元素。这就是我这样做的方式。问题是pts.length
始终相同,删除的元素的值为null
。因此,有时我会收到错误消息java.lang.NullPointerException
。
for (int i = 0; i < points.length; i++) {
int ind = r.nextInt(pts.length);
TSPPoint pt = points[ind];
pts = removeElements(points,ind);
solPoints[i] = pt;
System.out.println(pts.length);
}
private static TSPPoint[] removeElements(TSPPoint[] input, int ind) {
List<TSPPoint> result = new LinkedList<TSPPoint>();
for(int i=0; i<input.length; i++)
if(i != ind)
result.add(input[i]);
return (TSPPoint[]) result.toArray(input);
}
答案 0 :(得分:1)
@nrathaus找到了你的错误。只是你的阵列混乱(你将points
传递给removeElements
,但在其他地方使用pts
。
但是,如果内存流失是一个问题,那么使用System.arraycopy
而不是临时removeElements
来实现LinkedList
的效率会更高效。:
private static TSPPoint[] removeElements(TSPPoint[] input, int ind) {
TSPPoint[] rv;
if (ind >= 0 && ind < input.length) {
// New array will be one smaller
rv = new TSPPoint[input.length - 1];
if (rv.length > 0) {
// Copy the bit before the element we delete
if (ind > 0) {
System.arraycopy(input, 0, rv, 0, ind);
}
// Copy the rest
System.arraycopy(input, ind + 1, rv, ind, input.length - ind);
}
}
else {
// No change
rv = input;
}
return rv;
}
请注意,如果你这么做很多,创建和发布所有这些数组可能并不理想。在整个过程中使用List
可能会更好。
答案 1 :(得分:1)
哇,为了删除每个元素,你在LinkedList
中重新创建了数组的其余部分,然后你变成了一个数组......这段代码在时间和空间上的表现都非常糟糕,所以是可读性,可维护性和可测试性。
为什么不一起使用数组?将points
转换为ArrayList
并直接在该列表上使用remove(index)
并使用llist的迭代器删除多个元素迭代?
答案 2 :(得分:1)
您的代码似乎(应该)做的是从points
的原始数组中删除随机元素并将它们附加到pts
数组,即创建置换< / {>的points
。
如果是这种情况,建议您将数组转换为List
并使用Collections.shuffle
。