2013-11-19 3 views
1

Мне нужно удалить некоторые объекты из массива, если они удовлетворяют условию.Удалить «отверстие» в массиве после удаления элемента

После удаления объекта из массива мне нужен массив, который не имеет «дыр», что означает, что мне нужно уменьшить размер массива: не размер массива, а сокращение количества объектов, которые он содержит.

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

Что было бы более эффективным?

  1. Копирование массива в новый массив
  2. Перебор массива и перенести элементы над «дыркой», созданного путем удаления объекта

Я должен использовать массив, я не могу использовать a List осуществления.

+0

Почему бы не узнать? –

+0

Создайте новый массив, если вы не хотите использовать arraylist. –

+0

Дефрагментация существующего массива на месте более эффективна в отношении времени выполнения, но тогда вы будете иметь завершающие пустые слоты. Если это нормально для вас ... – isnot2bad

ответ

5

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

+0

Это из моей домашней работы, поэтому мне нужно использовать Array – user2214609

+0

Если вы думаете об этом, массивы являются «блоком» назначенной памяти, поэтому даже если вы сдвинете данные вниз, все равно будет существовать нулевое значение элемент в конце. Так как вы предложили вам создать новый меньший массив и скопировать элементы в него. Элегантный класс классов Arrays может помочь http://www.tutorialspoint.com/java/util/java_util_arrays.htm –

+0

Его хорошо, что весь мой элемент в конце имеет значение null, поскольку в начале после определения размера массива все элементы внутри null, мне просто нужно убедиться, что в этом массиве не будет никаких отверстий в midlle – user2214609

2

Если вы не хотите использовать решение ArrayList yuor, это прекрасно. Но вместо копирования вашего массива создайте новый пустой с размером вашего массива, а затем заселите его в цикле for.

1

Оба решения - это сложность O (N), за исключением того, что для первого требуется другое пространство памяти O (N). Итак, второй немного лучше, если вам действительно нужно работать с Array.

Если вы работаете над массивом элементов, которые требуют частого добавления и удаления в середине, я бы предложил вам использовать реализацию Linked-List, чтобы он мог дать вам постоянное время для добавления и удаления любого элемента в вашем массив.

2

1) Вы можете менять местами удаленный элемент с последним элементом и сделать что-то вроде size--

2) Если вы не можете поменять, вы должны использовать System.arraycopy(...) метод несколько раз, чтобы скопировать части массива в новый массив.

public static Object[] deleteElement(Object[] oldArray, int position) { 
    Object[] newArray = new Object[oldArray.length - 1]; 
    System.arraycopy(oldArray, 0, newArray, 0, position); 
    System.arraycopy(oldArray, position + 1, newArray, position, newArray.length - position); 
    return newArray; 
} 
1

Вот простой пример использования System.arraycopy:

Integer[] i1 = new Integer[] {1, 2, 3, 4, 5}; 
    Integer[] i2 = new Integer[4]; 

    // Copy everything, except the third value of i1: 
    System.arraycopy(i1, 0, i2, 0, 2); 
    System.arraycopy(i1, 3, i2, 2, 2); 

    for (int j : i2) 
    { 
     System.out.println(j); 
    } 
2

В зависимости от ваших требований,

мне нужно, что мой массив будет без каких-либо «дыр», поэтому мне нужно, чтобы «сжать "этот массив,

вы must создайте новый массив и переместите остальные объекты к нему. Массивы представляют собой конструкцию фиксированного размера. Вы не можете «сжать» массив. Вы можете выделить только новую память и переместить элементы в новый массив.

EDIT: вы должны изменить свой вопрос, чтобы включить информацию о разрешении null в конце массива. В этом случае перемещение индекса элементов назад 1 было бы лучше, поскольку оно устраняет выделение памяти (что дорого) и будет иметь в среднем n/2 операции (предполагая случайное удаление) в отличие от n.

+0

Этот вопрос кричит домашнее задание, и это лучший ответ для изучения. Причина, по которой вы ограничены использованием массива, заключается в том, что ваш профессор/преподаватель хотел бы, чтобы вы решили проблему, вместо того, чтобы использовать реализацию, которая уже существует. – Zerkz

+0

Вот почему я думаю, что лучший вариант - переместить все элементы после нулевого возврата. – user2214609

+0

@ user2214609: То, как вы заявили, что ваш вопрос подразумевает, что в конце будет «дыры». Если вы можете иметь нулевые значения в конце, то смещение всех элементов от n до n-1 назад по одному индексу было бы предпочтительным с точки зрения производительности, но это НЕ предпочтительнее с точки зрения «правильности». – MadConan

1

Некоторые псевдокод

  • Шаг 1: Найти все объекты из массива, которые соответствуют, что вы хотите, чтобы соответствовать и переписать их с уникальным значением (например: если массив содержит только целые числа 0 или выше , переписать те, которые вы хотите удалить с -1)
  • Шаг 1.5: сохранить счетчик от суммы удаляет вы сделали
  • Шаг 2: Создайте новый массив с размером (oldarray.size - counterFromStep1.5)
  • Шаг 3: для каждого непустого элемента в oldarray THA T НЕ (удалить целое число), добавить его в новый массив
Смежные вопросы