谁能告诉我如何在 java 中同时删除两个元素?

Can Anyone tell me How to delete two elements at same time in java?

例如:

int[] nums = {11,12,13,14,15,16};
int[] position = {1,2};

所以,这里我想删除多个元素,例如,我想同时删除索引 1 和 2:当我调用 delete 方法时。

public int[] delete(int[] source, int[] position) {
    // How do I implement this?
}

//Main Class
public static void main(String[] args){

    int[] newArray = delete(nums, position);

}

那么,我该如何解决这个问题?????我已经尝试了很多次,但我无法映射位置和数组值。所以,删除两个值真的很难。

也许使用 ArrayList 并将数组转换为 Integer 而不是原始 int 更容易。


  1. 这里的第一个问题是在 delete 函数的 position[] 参数中:你可以得到一个 IndexOutOfBoundsException,因为任何调用这个函数的人都可以传递一个不能包含在数组 num[]

例如:

num[] 数组大小为 4,有人传递位置 {1,6},在这种情况下第 6 个索引不存在于 num[])


  1. 第二个问题是确保删除正确的索引。

例如num{34, 53, 33, 64}和position{0, 1}代表要删除的索引,你会期望数字34和53被删除,但是作为0索引删除后,53 变为 0 索引,而不是以前的索引 1。

所以这里的解决方法是反转排序位置,所以它可以防止这个问题。


下面是一个示例代码,只是为了说明删除功能:

Integer num[]... //Using Integer instead of int will be use to remove items using ArrayList

public void delete(Integer[] position){   //position[] being Integer instead of int will be easier to rever sorting
    //
    //Reversing order of position[] to prevent problem 2
    Arrays.sort(position, Collections.reverseOrder());
    //
    ArrayList<Integer> objArrayListMyNumbers = Array.asList(num);
    //
    // Iterate through every element of position
    for(Integer i : position){
        //
        //It's better surround by try and catch, because of the problem 1 (IndexOutOfBoundsException)
        try{
            objArrayListMyNumbers.remove(i);
        }
        catch(IndexOutOfBoundsException e){
            e.printStack();
        }
    }
//
    //Gets a new Array with items removed
    num = new Integer(objArrayListMyNumbers.size());
    num = objArrayListMyNumbers.toArray(); 
}

您正在寻找这样的方法吗? Java 数组无法调整大小,您必须创建一个新数组。

public static int[] delete(int[] source, int[] position) {
    Arrays.sort(position);
    int positionIdx = 0;
    int[] newArray = new int[source.length - position.length];
    for (int i = 0; i < source.length; i++) {
        if (positionIdx < position.length && i == position[positionIdx]) {
            positionIdx++;
        } else {
            newArray[i - positionIdx] = source[i];
        }
    }
    return newArray;
}

用法:

public static void main(String[] args) {
    int[] nums = {11, 12, 13, 14, 15, 16};
    int[] position = {1, 2};
    System.out.println(Arrays.toString(delete(nums, position)));
}

可能有一个基于过滤流的解决方案:

static int[] deleteAtPositions(int[] nums, int[] positions) {
    Set<Integer> idx = Arrays.stream(positions).boxed().collect(Collectors.toSet());

    return IntStream.range(0, nums.length)
                    .filter(i -> !idx.contains(i)) // no need to check for bounds
                    .map(i -> nums[i])
                    .toArray();
}

int[] nums = {11,12,13,14,15,16};
int[] positions = {1,2};

System.out.println(Arrays.toString(deleteAtPositions(nums, positions)));

输出:

[11, 14, 15, 16]