0

サンプルとして、インターフェイスMySortedSet<E>を実装する単純なJavaを開発していSortedSet<E>ます。である単純な配列でバックアップされE[] arrayます。

それに関していくつか質問があります:

これはクラスです:(私は関連する部分ではなく、コード全体を書いているわけではありません)

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

質問1:コンストラクターでこれの代わりに新しい配列を作成するためのより良い解決策があるかどうか誰かに教えてもらえますかthis.array = (E[]) new Object[this.capacity];

4

3 に答える 3

1

コードを変更して、安全でないキャストを削除できます。

public MySortedSet(Class<E> clazz) {
    capacity = 10;
    array = Array.newInstance(clazz, capacity);
}

これはクライアントコードにオブジェクトを提供するように強制しますがClass<E>、これはこのクラスの問題を回避するために使用される非常に一般的なコードパターンです(Classコンストラクターで型付きオブジェクトが必要な場合)。

于 2012-05-28T07:56:51.360 に答える
1

ArrayList<E> 要素をプレーンに格納しObject[]、プリミティブ値は自動ボックス化され、削除された要素によって残された穴に割り当てられます。null

実装するクラスは、 fromと同様に機能する実装するComparable<E>必要があります。内部コンパレータをチェックしてオブジェクトの自然な順序にフォールバックするか、内部の「自然な順序を使用する」コンパレータの実装を定義することができます。int compareTo(E other)compare(E o1, E o2)Comparatornull

二分探索は、アイテムまたはアイテムがソートされたリストに挿入されるべき場所を見つけるために必要な比較の数を最小限に抑える方法です。最初から各要素をチェックする代わりに、リストの中間点から開始します。探しているアイテムが見つかった要素の前に来る必要がある場合は、前に向かって半分シフトして繰り返します。それ以外の場合は、途中で最後までシフトして繰り返します。繰り返すたびに、前の下限/上限と中点を新しいサブリストとして使用し、各ステップの要素数を半分にします。

推測が高すぎるか低すぎるかが通知されるたびに、1から100までの数字を推測しようと考えてください。

  • 50-高すぎる
  • 25-低すぎる
  • 37-高すぎる
  • 31-低すぎる
  • 34-低すぎる
  • 35-正解です!
于 2012-05-28T00:54:18.477 に答える
1

ここで行っていることを継続するか、それをそのままにして、Object[]出力時に値をキャストする必要があります。(ArrayListたとえば、実装は後者を実行します。)

于 2012-05-28T06:30:08.627 に答える