从数组中删除一些元素

时间:2014-01-08 10:35:40

标签: java arrays

我需要删除数组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);
}

3 个答案:

答案 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