2012-05-28 3 views
1

В качестве примера я разрабатываю простой MySortedSet в java, который реализует интерфейс SortedSet. Он подкрепляется простым массивом, который является массивом E [].Как удалить объект из массива Java (не использовать коллекции)

У меня есть несколько вопросов по поводу, что:

Это класс: (я не пишу весь код, а не связанные части)

public class MySortedSet<E> implements SortedSet<E>, Iterator<E> { 

private E[] array; 
private Comparator<? super E> _comparator; 
private int size = 0; 
private int capacity; 

@SuppressWarnings("unchecked") 
public MySortedSet() { 
    this.capacity = 10; 
    this.array = (E[]) new Object[this.capacity]; 
    // this.array = Array.newInstance(Class<E> var,int size); 
    // We have to get Class<E> from outside caller. 
} 
} 

Поскольку он принимает все вроде типа от примитивного к ссылочные типы и т. д. Я не совсем уверен, что при удалении элемента назначение нулевого значения является хорошим способом вместо удаленного элемента. Поскольку Java инициализирует примитивные типы с 0. Таким образом, null работает только для ссылочных типов.

Ниже, вероятно, очень плохой дизайн:

@Override 
public boolean remove(Object o) { 
    int indexOfElement = this.find(o); 
    boolean removed = false; 
    if (indexOfElement != -1) { 
     this.array[indexOfElement] = null; 
     removed = true; 
    } 
    return removed; 
} 

Может кто-нибудь сказать мне, что лучший способ, чтобы удалить элемент из массива?

Edit:

Честно говоря, что я имею в виду, чтобы удалить элемент из простого массива, как скопировать весь массив без удаленного элемента в новый массив, но я не уверен, насколько эффективным было бы с точки зрения производительности и т. д.

+0

Это не просто удаление элемента из массива. Вы пытаетесь реализовать 'remove' для реализации' SortedSet', поддерживаемой массивом. Я думаю, что это поможет решить вопрос, ясно ли это в названии. –

+3

Эта реализация не принимает примитивные типы, насколько я могу видеть. – Perception

+0

@Перцепция: Я считаю, что он принимает примитивные типы вместо E. Зачем вы так говорите? – Tarik

ответ

1

Это зависит от контекста того, как вы хотите использовать свой массив. Например, если вы собираетесь выполнять итерацию по массиву и используя его содержимое для стандартных методов, таких как Arrays.sort(), они могут генерировать NullPointerExceptions, если в вашем массиве есть значения null.

Если вы действительно хотите, чтобы удалить элементы из массива безопасным способом, я предлагаю изменить свой массив к ArrayList, как это ...

ArrayList<Object> list = new ArrayList<Object>(); 
list.add(object); 
list.remove(object); 

Как это будет на самом деле удалить элемент из список полностью - нет nulls или что-нибудь останется, а выполнение таких методов, как length(), вернет реальное значение.

Для случаев, когда я использовал массив, я устанавливаю значение null и гарантирую, что все итерации по массиву проверяют, что value != null, прежде чем пытаться его запросить. После установки nulls для удаленных элементов я обычно перебираю массив и вручную сортирую все nulls до конца массива, а затем делаю System.arraycopy() для изменения размера массива. Это оставит вам новый массив правильного размера со всеми элементами в нем, кроме удаленных. Тем не менее, я предлагаю это, только если вы действительно должны использовать массив, поскольку он медленнее и значительно увеличивает вероятность ошибок и NullPointerExceptions.

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

Object[] array = new Object[20]; 
int realSize = 15; // real number of items in the array 

public void remove(int arrayIndex){ 
    array[arrayIndex] = array[realSize-1]; 
    realSize--; 
} 

Этот метод удаляет элемент в массиве с помощью «замены» его с элементом в последней позиции массива - его очень быстро и довольно реализовать, если вы не заботитесь о порядке сортировки.

+0

Что относительно примитивных типов, поскольку они инициализируются 0 для чисел? – Tarik

+0

P.S: Это должен быть простой массив в качестве резервной копии. Я не могу использовать Коллекции, так как мне не разрешают. – Tarik

+0

Я бы предположил, что все примитивы должны использовать объект-эквивалентный массив, такой как 'Integer []' или 'Long []' - таким образом вы могли бы включить 'nulls'. Увидев, что вы должны использовать массивы, я бы предложил вторую половину ответа, особенно вокруг сортировки и 'System.arraycopy()'. – wattostudios

Смежные вопросы