Это прямой способ сделать это:
Нестабильная версия (меньше копирует).
for (var i:int, j:int = array.length - 1, temp:Object; i <= j;) {
temp = array[i];
if (temp == "duck") {
array[i] = array[j];
array[j] = temp;
j--;
} else {
i++;
}
}
array.length = i;
И стабильная версия (больше копирования, но порядок исходного массива не изменился):
for (var i:int, j:int, temp:Object; i < array.length; i++) {
temp = array[i];
if (temp != "duck") {
array[j] = temp;
j++;
}
}
array.length = j;
Однако, если бы вы могли гарантировать, что значения уникальны, алгоритм был бы другим, поскольку вам не нужно было бы проверять элементы после того, который вы нашли.
Алгоритм был бы существенно другим, если бы массив был отсортирован, потому что вы могли бы использовать двоичный поиск, чтобы найти элемент, который нужно удалить. В некоторых очень специфических ситуациях, как, например, если у вас есть хорошо обоснованный набор (который является вашим массивом), удаление будет еще проще, потому что положение искомого элемента может быть определено за постоянное время. Последнее можно смягчить за счет использования индексов (просто говоря, у вас может быть хэш-таблица, которая использует элементы массива в качестве ключей и их смещения в массиве в качестве значений).
Опять же, вам нужно рассмотреть все эти случаи и то, что практично в отношении вашей программы.
Как я упоминал выше, могут быть преимущества, если вы используете другую структуру данных, или если вы сортируете при вставке, или если вы индексируете при вставке.
Наконец, создание копии с удаленными нежелательными элементами отличается от деструктивного удаления элементов из того же массива.
person
Community
schedule
25.03.2013