Я пытаюсь с такой петлей
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Но это не приятно. Кто-нибудь может предложить мне лучшее решение?
Некоторые полезные ориентиры для принятия лучшего решения:
Iterator
? Копай ява-док. download.oracle.com/javase/6/docs/api/java/util/...Ответы:
Пытаться:
Прочитайте API Java . Код будет выбрасывать
java.lang.UnsupportedOperationException
для неизменяемых списков (например, созданных с помощьюArrays.asList
); см. этот ответ для более подробной информации.источник
List.removeAll()
составляет п ^ 2 . Просто говорю.O(n)
мне обоимArrayList
иLinkedList
.contains()
циклы весь массив), и так какsingleton
это только один элемент, это будетN * 1 = N
. Однако в целом это будет такN^2
.По состоянию на 2015 год это лучший способ (Java 8):
Примечание. Этот код генерирует
java.lang.UnsupportedOperationException
списки фиксированного размера (например, созданные с помощью Arrays.asList), включая неизменяемые списки.источник
removeIf
это быстрее, но это предположение.Arrays.asList
не неизменны . Это фиксированный размер.источник
Не эффективно, но коротко
источник
Если вы предпочитаете неизменяемые объекты данных или просто не хотите быть разрушительными для списка ввода, вы можете использовать предикаты Guava.
источник
источник
removeAll(..null..)
. Спасибо!Перед Java 8 вы должны использовать:
Использование после Java 8:
Причина здесь в сложности времени. Проблема с массивами состоит в том, что операция удаления может занять O (n) времени для завершения. На самом деле в Java это копия массива оставшихся элементов, перемещаемых для замены пустого места. Многие другие решения, предлагаемые здесь, вызовут эту проблему. С технической точки зрения первый O (n * m), где m равно 1, потому что это одиночный ноль: поэтому O (n)
Вы должны удалить все синглтоны, внутренне это выполняет batchRemove (), который имеет позицию чтения и позицию записи. И повторяет список. Когда он достигает нуля, он просто повторяет позицию чтения на 1. Когда они одинаковы, он проходит, когда они отличаются, он продолжает двигаться, копируя значения. Тогда в конце это урезает к размеру.
Это эффективно делает это внутренне:
То, что вы можете явно видеть, является операцией O (n).
Единственное, что может быть быстрее, - это если вы перебираете список с обоих концов, и когда вы находите ноль, вы устанавливаете его значение равным значению, которое вы нашли в конце, и уменьшаете его. Итерировали, пока два значения не совпали. Вы бы испортили порядок, но значительно сократили бы количество установленных вами значений по сравнению с теми, которые вы оставили в покое. Это хороший способ узнать, но он не сильно поможет, поскольку .set () в основном бесплатен, но эта форма удаления является полезным инструментом для вашего пояса.
Хотя это кажется достаточно разумным, .remove () внутри итератора вызывает:
Что снова является операцией O (n) при удалении. Он выполняет System.arraycopy (), что опять-таки не то, что вам нужно, если вы заботитесь о скорости. Это делает это п ^ 2.
Есть также:
Который есть O (m * n ^ 2). Здесь мы не только перебираем список. Мы повторяем весь список, каждый раз, когда мы совпадаем с нулем. Затем мы делаем n / 2 (средние) операции, чтобы выполнить System.arraycopy () для удаления. Вы можете буквально отсортировать всю коллекцию между элементами со значениями и элементами с нулевыми значениями и обрезать окончание за меньшее время. На самом деле, это верно для всех сломанных. По крайней мере теоретически, фактическая system.arraycopy на самом деле не является операцией N на практике. В теории теория и практика - это одно и то же; на практике это не так.
источник
Существует простой способ удаления всех
null
значений из.collection
Вам нужно передать коллекцию, содержащую ноль, в качестве параметраremoveAll()
методаисточник
Objects
Класс имеет ,nonNull
Predicate
который может быть использован сfilter
.Например:
источник
Используя Java 8, вы можете сделать это, используя
stream()
иfilter()
или
Для получения дополнительной информации: Java 8 - Streams
источник
Это простой способ удалить значения по умолчанию из массива
в противном случае строковое значение "null" удалить из массива
источник
Я поиграл с этим и обнаружил, что trimToSize (), кажется, работает. Я работаю на платформе Android, поэтому она может отличаться.
источник
trimToSize
не изменяет содержимоеArrayList
. Если это отличается в Android, это, вероятно, ошибка.Мы можем использовать итератор для того же самого, чтобы удалить все нулевые значения.
источник
Я использовал интерфейс потока вместе с операцией сбора потока и вспомогательным методом для создания нового списка.
источник
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
В основном я использую это:
Но после того, как я выучил Java 8, я переключился на это:
источник
Используя Java 8, это может быть выполнено различными способами, используя потоки, параллельные потоки и
removeIf
метод:Параллельный поток будет использовать доступные процессоры и ускорит процесс для списков разумного размера. Перед использованием потоков рекомендуется всегда проводить сравнительный анализ.
источник
Аналогичен ответу @Lithium, но не выдает ошибку «Список может не содержать тип null»:
источник
источник