Вопрос-ответ

How do I remove objects from an array in Java?

Как мне удалить объекты из массива в Java?

Учитывая массив из n объектов, предположим, что это массив строк, и он имеет следующие значения:

foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";

Что мне нужно сделать, чтобы удалить все строки / объекты, равные "a" в массиве?

Переведено автоматически
Ответ 1

[Если вам нужен готовый к использованию код, пожалуйста, перейдите к моему "Edit3" (после вырезания). Остальное здесь для потомков.]

Чтобы конкретизировать идею Мусорщика:

List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

Редактировать: сейчас я использую Arrays.asList вместо Collections.singleton: singleton ограничен одной записью, тогда как asList подход позволяет добавлять другие строки для последующей фильтрации: Arrays.asList("a", "b", "c").

Правка2: Приведенный выше подход сохраняет тот же массив (поэтому массив остается той же длины); элементу после последнего присваивается значение null. Если вы хотите, чтобы размер нового массива соответствовал требуемому, используйте это вместо:

array = list.toArray(new String[0]);

Правка 3: Если вы часто используете этот код в одном и том же классе, возможно, вы захотите рассмотреть возможность добавления его в свой класс:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

Затем функция становится:

List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

Это позволит прекратить засорять вашу кучу бесполезными пустыми массивами строк, которые в противном случае были бы newредактируемыми при каждом вызове вашей функции.

предложение cynicalman (см. Комментарии) также поможет с засорением кучи, и справедливости ради я должен упомянуть об этом:

array = list.toArray(new String[list.size()]);

Я предпочитаю свой подход, потому что может быть проще явно ошибиться с размером (например, вызвать size() неправильный список).

Ответ 2

Альтернатива в Java 8:

String[] filteredArray = Arrays.stream(array)
.filter(e -> !e.equals(foo)).toArray(String[]::new);
Ответ 3

Создайте List из массива с помощью Arrays.asList() и вызовите remove() для всех соответствующих элементов. Затем вызовите toArray() для "Списка", чтобы снова преобразовать в массив.

Не очень производительно, но если вы правильно инкапсулируете его, вы всегда сможете позже сделать что-то более быстрое.

Ответ 4

Вы всегда можете сделать:

int i, j;
for (i = j = 0; j < foo.length; ++j)
if (!"a".equals(foo[j])) foo[i++] = foo[j];
foo = Arrays.copyOf(foo, i);
2023-11-28 06:24 java arrays