Может ли кто-нибудь сказать мне, как удалить два элемента одновременно в java? - PullRequest
0 голосов
/ 12 июля 2020

Например:

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

Итак, здесь я хочу удалить несколько элементов, например, я хочу удалить индекс 1 и 2 одновременно: когда я вызываю метод удаления.

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);

}

Итак, как мне решить эту проблему ????? Я пробовал много раз, но мне не удалось отобразить позицию и значение массива. Так что удалить два значения действительно сложно.

Ответы [ 3 ]

2 голосов
/ 12 июля 2020

Может быть, проще использовать ArrayList и преобразовать ваши массивы как Integer вместо примитивного int.

  1. Первая проблема здесь в параметре position[] в функции delete: вы можете получить IndexOutOfBoundsException, потому что любой, вызывающий эту функцию, может передать список позиций, которых не может быть в массиве num []

Например:

массив num[] имеет размер 4 и кто-то передает позицию {1,6}, в этом случае шестой индекс не существует в num [])

Вторая проблема заключается в том, чтобы гарантировать удаление правильного индекса.

Например, если num {34, 53, 33, 64} и позиция {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(); 
}
1 голос
/ 12 июля 2020

Вы ищете такой метод? 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)));
}
0 голосов
/ 12 июля 2020

Может быть решение на основе фильтрации потоков:

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]
...