2

サンプルとして、SortedSetインターフェースを実装する単純なMySortedSetをJavaで開発しています。これは、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()生成される可能性があります。NullPointerExceptionsnull

安全な方法で配列からアイテムを本当に削除したい場合は、配列を次の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 に答える