Сократите длину массива, после того как элемент, удаляют в Java

Примечание: Следующее является моей домашней работой/присвоением, не стесняйтесь не отвечать, будете ли Вы.

Я хочу удалить/удалить элемент из Массива строк основной (Набор), мне не разрешают использовать Наборы.. и т.д.

Теперь у меня есть это:

void remove(String newValue) {

            for ( int i = 0; i < setElements.length; i++) {
               if ( setElements[i] == newValue ) {
                    setElements[i] = "";

               }
            }

       }   

Я делаю то, что я хочу, поскольку это удаляет элемент из массива, но это не сокращает длину. Следующее является выводом, в основном это удаляет индексированный № 1 элемента.

D:\javaprojects>java SetsDemo
Enter string element to be added
A
You entered A
Set size is: 5
Member elements on index: 0 A
Member elements on index: 1 b
Member elements on index: 2 hello
Member elements on index: 3 world
Member elements on index: 4 six
Set size is: 5
Member elements on index: 0 A
Member elements on index: 1
Member elements on index: 2 hello
Member elements on index: 3 world
Member elements on index: 4 six
5
задан ggorlen 29 August 2018 в 00:01
поделиться

5 ответов

Вы не можете изменить длину объекта массива после его создания. Вот отрывок из JLS 10.2. Переменные массива :

После создания объекта массива его длина никогда не изменяется. Чтобы переменная массива ссылалась на массив другой длины, переменной должна быть присвоена ссылка на другой массив.

Это означает, что для решения этой проблемы вам придется выделить новый массив, который на один элемент короче исходного массива, и скопировать оставшиеся элементы.

Если вам нужно удалить элемент с индексом k , а исходный массив содержит L элементов, то вам нужно скопировать элементы (верхние границы исключительны):

  • Из [0, k) в [0, k) ( k элементов)
  • Из [k + 1, L) к [k, L-1) ( Lk-1 элементов).
  • Всего скопировано L-1 элементов

static String[] removeAt(int k, String[] arr) {
    final int L = arr.length;
    String[] ret = new String[L - 1];
    System.arraycopy(arr, 0, ret, 0, k);
    System.arraycopy(arr, k + 1, ret, k, L - k - 1);
    return ret;
}
static void print(String[] arr) {
    System.out.println(Arrays.toString(arr));       
}   
public static void main(String[] args) {
    String[] arr = { "a", "b", "c", "d", "e" };
    print(arr); // prints "[a, b, c, d, e]"

    arr = removeAt(0, arr);
    print(arr); // prints "[b, c, d, e]"

    arr = removeAt(3, arr);
    print(arr); // prints "[b, c, d]"

    arr = removeAt(1, arr);
    print(arr); // prints "[b, d]"

    arr = removeAt(0, arr);
    arr = removeAt(0, arr);
    print(arr); // prints "[]"
}

Используется System.arraycopy ; вы всегда можете написать свой, если это не разрешено.

static void arraycopy(String[] src, int from, String[] dst, int to, int L) {
    for (int i = 0; i < L; i++) {
        dst[to + i] = src[from + i];
    }
}

Это упрощенная реализация, которая не обрабатывает src == dst , но в данном случае ее достаточно.

См. Также


Примечание к == для String сравнение

В большинстве случаев использование == для сравнения объектов String является ошибка. Вместо этого следует использовать равно .

String ha1 = new String("ha");
String ha2 = new String("ha");
System.out.println(ha1 == ha2); // prints "false"
System.out.println(ha1.equals(ha2)); // prints "true"

См. Также

6
ответ дан 13 December 2019 в 19:23
поделиться

Размер массива в Java не может быть изменен после создания массива. Следующие ссылки должны помочь вам перенести существующие элементы в новый массив: -)

См.: System.arraycopy и Array.copyOf (*) .

3
ответ дан 13 December 2019 в 19:23
поделиться

По сути, вам нужно создать новый массив, длина которого равна длине старого массива минус 1, затем в цикле скопировать допустимые элементы из старого массива в новый, а затем заменить старый массив новым.

Поскольку это домашнее задание, подробности оставим в стороне. Не стесняйтесь оставлять комментарии для уточнения.

1
ответ дан 13 December 2019 в 19:23
поделиться
void remove(String newValue) {
    if(setElements.length == 0) return;
    String [] array = new String[setElements.length-1];
    int j = 0;
    for ( int i = 0; i < setElements.length; i++) {
       if ( setElements[i] != newValue ) {
            array[j++] = setElements[i];
       }
    }
    setElements = array;
}
0
ответ дан 13 December 2019 в 19:23
поделиться

Все, что setElements[i] = ""; делает, это изменяет значение элемента в массиве. На самом деле он ничего не удаляет из массива. Если бы вы использовали класс коллекции и вызвали remove(i), то вы бы действительно удалили этот элемент из коллекции. Но здесь вы просто изменяете его значение. Однако массивы в Java имеют фиксированный размер и не могут быть изменены, поэтому нет способа удалить из них элементы. Поэтому решением является создание нового массива с длиной на единицу меньше старого, а затем копирование всех значений, которые вы хотите сохранить, в новый массив. Итак,

  1. Создайте новый массив с длиной setElements.length - 1.

  2. Скопируйте в новый массив все элементы из setElements, кроме того, который вы хотите удалить. Обратите внимание на то, что индексы двух массивов будут отличаться на единицу, а не равны, когда вы достигнете индекса элемента, который вы хотите удалить.

  3. Установите setElements в новый массив, если вы хотите продолжать использовать одну и ту же переменную для вашего массива.

1
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: