1

私は現在Javaを学ぼうとしており、独自のコンテナクラスを実装することでそれをやろうとしています. 私の質問は次のとおりです。
たとえば、3 つの異なるコンテナー クラスを実装した場合、それぞれを 3 つの異なる方法で並べ替えることができるようにしたいので、次のようにします。

Container_one with sort_1, sort_2, sort_3  
Container_two with sort_1, sort_2, sort_3  
Container_three with sort_1, sort_2, sort_3  

ここで、sort_1、sort_2、および sort_3 はすべてのコンテナーで同一のアルゴリズムです (ただし、それらは互いに異なります)。それらを一度だけ実装してから、他のコンテナーで再利用する方法はありますか?それとも、毎回実装する必要がありますか?新しいコンテナを実装していますか?
ありがとう。

4

3 に答える 3

3

アルゴリズムを操作対象のデータ構造から分離する 1 つの方法は、アルゴリズムを実装するために必要な操作を考え、これらの操作をインターフェースとして抽象化し、インターフェースに関してアルゴリズムをコード化し、すべてのデータを取得することです。構造体はインターフェイスを実装します。

たとえば、並べ替えアルゴリズムで、 と の位置にある項目を比較する方法iと、 と の項目をj交換する方法が必要だとします。次に、インターフェイスは次のようになります。ij

interface Sortable {
    int compare(int i, int j);
    void swap(int i, int j);
}

これで、次の観点からソーターを実装できますSortable

void sort1(Sortable container) {
    // first way to sort
}

void sort2(Sortable container) {
    // second way to sort
}

最後に、コンテナに以下を実装させますSortable

class CoolContainer1 implements Sortable {
    public int compare(int i, int j) {
        ...
    }
    public void swap(int i, int j) {
        ...
    }
    // other operations
}

class CoolContainer2 implements Sortable {
    public int compare(int i, int j) {
        ...
    }
    public void swap(int i, int j) {
        ...
    }
    // other operations
}

上記はすべて、学習演習の単なる提案であることに注意してください。Java には、リストと配列で機能する強力な並べ替え機能が用意されており、並べ替え順序を可能な限り詳細に指定できます。詳細については、メソッドをループしてCollections.sortください。

于 2012-06-30T15:19:22.753 に答える
1

並べ替えアルゴリズムは、3 つのSorterクラスまたは静的sort(Container)メソッドに外部化され、並べ替えるコンテナーを引数として取得する必要があります。すべてのコンテナーが共通のインターフェースを実装している場合、同じアルゴリズムを使用してすべてのコンテナーを並べ替えることができます。

共通インターフェイスには、コンテナーのサイズを取得し、特定のインデックスで要素を取得し、特定のインデックスで要素を設定するためのメソッドのみを含める必要があります。これは、コンテナーを並べ替えるには十分です。

または、コンテナのすべての要素を含む配列を提供するメソッドと、(ソートされた) 配列のすべての要素でコンテナを再初期化するメソッドの 2 つのメソッドを持つこともできます。

あなたは再実装java.util.Listしていjava.util.Collections.sort()ます;

于 2012-06-30T15:22:56.390 に答える
0

コンテナからアルゴリズムを分離します。例えば:

interface SortAlgorithm { ... }

class Sort1 implements SortAlgorithm { ... }

次に、並べ替えアルゴリズムを使用して各コンテナーをパラメーター化します。

class Container1 { public Container(SorthAlgorithm alg) {...} ... }

aContainer = new Container1(new Sort1()) 

Java ライブラリのSortedSet階層を調べてください。

各ソート可能なコレクションは、項目の比較に使用されるロジック ( Comparator ) でパラメーター化できます。

通常、「並べ替えアルゴリズム」(比較方法ではありません) は、コレクションの内部構造 (つまり、バランスのとれたツリー) と密接に結合されています。そのため、並べ替えアルゴリズム全体ではなく、比較方法を「共有」する方が理にかなっています。

于 2012-06-30T15:21:00.520 に答える