List<String> list = newArrayList<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(newString[0]);
Правка 3: Если вы часто используете этот код в одном и том же классе, возможно, вы захотите рассмотреть возможность добавления его в свой класс:
List<String> list = newArrayList<>(); Collections.addAll(list, array); list.removeAll(Arrays.asList("a")); array = list.toArray(EMPTY_STRING_ARRAY);
Это позволит прекратить засорять вашу кучу бесполезными пустыми массивами строк, которые в противном случае были бы newредактируемыми при каждом вызове вашей функции.
предложение cynicalman (см. Комментарии) также поможет с засорением кучи, и справедливости ради я должен упомянуть об этом:
array = list.toArray(newString[list.size()]);
Я предпочитаю свой подход, потому что может быть проще явно ошибиться с размером (например, вызвать size() неправильный список).
Создайте 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);