サンプルとして、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.
}
}
質問3:これはソートされたセットであり、要素がソートされていると想定されているため、コンストラクターの説明があります。
このコンストラクターを使用してソートされたセットを作成する場合、要素は自然な順序付けを使用して順序付けられていると見なされます(つまり、EはComparableを実装します)。
2つの異なるコンストラクターを取得します。1つはパラメータなしで、もう1つは受け入れてComparator<? super E>
います。
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.
}
public MySortedSet(Comparator<? super E> comparator) {
this._comparator = comparator;
}
渡されない場合は、自然な順序を使用する必要がありますが、メソッドにアクセスするために何らかの方法でcomparator
取得する必要があるため、それをどのように実行するかはよくわかりません。各要素を並べ替えるメソッドを比較しながら呼び出すことができるように、呼び出す方法を教えてください。Comparator
compare
sort
コード全体を見たい人は、次のアドレスを参照してください:http ://codepaste.net/4ucvsw完璧ではありませんが、私はそれに取り組んでいます。
質問4:コードガイドによると:
特定のアイテムを検索する最も速い方法はバイナリ検索を使用することであるため、コレクション内のアイテムが常にソートされた順序になっていることを確認する必要があります。これは、見た目ほど難しくはありません。新しいアイテムを挿入するとき、それを挿入している配列はすでにソートされていると想定できます。したがって、必要なのは、新しいアイテムが属する配列内の位置を見つけ、新しいアイテムよりも大きいものをすべて1スロット右にシフトして、新しいアイテムを挿入することです。これは挿入ソートと呼ばれます。
これがsort
メソッドロジックです。新しいアイテムがどこに属するかを見つけるために二分探索を行う必要があるので、その場所に新しいアイテムを挿入し、もう1つのスロットを右に移動できます。
しかし、何を見つける必要があるのかよくわからないので、ここで二分探索がどのように機能するかはよくわかりません。見つけるアイテムではなく、追加するアイテムが与えられます。代わりに、各要素を追加する必要のある要素と比較し、最後の小さくて最初に大きいアイテムを見つけたら、最初の大きいアイテムのインデックスを取得し、それらを右に移動して、インデックスに新しいアイテムを追加します。 。