2

作为示例,我正在用 java 开发一个简单的 MySortedSet,它实现了 SortedSet 接口。它由一个简单的数组备份,即 E[] 数组。

我对此有几个问题:

这是类:(我不是在编写整个代码,而是在编写相关部分)

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.
 }
}

由于它接受从原始类型到引用类型等所有类型的类型。我不确定何时删除项目,分配 null 是代替已删除项目的好方法。由于 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;
}

有人能告诉我从数组中删除元素的最佳方法是什么吗?

编辑:

老实说,我想从一个简单的数组中删除一个元素就像将没有删除项的整个数组复制到一个全新的数组中,但我不确定它在性能等方面的效率如何。

4

1 回答 1

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--;
}

此方法通过将数组中的项“替换”为数组最后位置的项来删除数组中的项 - 如果您不关心排序顺序,它的实现非常快速且漂亮。

于 2012-05-28T02:31:24.437 回答