2

序文: 私は友人に代わってこれを投稿しています (どうやら自分で投稿するのは恥ずかしがり屋です)。関連する質問を閲覧しましたが、重複が見つからなかったようです.. Java ですので、これが重複している場合はあらかじめお詫び申し上げます。

これはコードの一部です:

public class ElencoEsami implements Comparable{
    private ArrayList<EsameMedico>  a = new ArrayList<EsameMedico>();
    private Comparable comparatore;
    public ElencoEsami() {
    }
    public void addEsame(EsameMedico e) {
        if (a.isEmpty()) {
            a.add(0,e);
            return;
        }

        for(int i=0;i<a.size();i++) {
            if (a.get(i).getData().after(e.getData())) {
                a.add(i,e);
                break;
            }
        }
        a.add(e);
    }
    public int compareTo(Object o) {
// ?????
    }

}

私の友人は、コードの再利用性を最大化するために「addEsame」を実装したいと考えています。特に、新しいクラス (私が信じている比較クラス) を追加するだけで、リストの順序付け方法 (現在は名前順) を変更できるようにしたいと考えています。または、少なくともそれが C++ で行う方法です)。

ありがとうございました!

4

7 に答える 7

10

まず、 Collections.sort(List list, Comparator c) を使用します

次に、必要な数の Comparator を並べ替え順序でコーディングします

それでおしまい。

于 2009-11-06T15:56:21.100 に答える
3

再利用可能な方法で多数のコンパレーターを実装したい場合は、それらを列挙型として実装するのが好きです ( Old Tech Perのアイデアに基づく):

public class EsameMedico {
    ...

    /** Enumeration of {@link Comparator}s for {@code EsameMedico}. */
    public static enum Comparators implements Comparator<EsameMedico> {
        /** Compares by name. */
        BY_NAME {
            public int compare(final EsameMedico em1, final EsameMedico em2) {
                return em1.name.compareTo(em2.name);
            }

            public void sort(final List<EsameMedico> l) {
                Collections.sort(l, BY_NAME);
            }
        },
        /* Compares by whatever. */
        BY_WHATEVER {
            public int compare(final EsameMedico em1, final EsameMedico em2) {
                return /* compare by "whatever" */;
            }

            public void sort(final List<EsameMedico> l) {
                Collections.sort(l, BY_WHATEVER);
            }
        };

        /** Sorts the list by this criterion. */
        public abstract void sort(List<EsameMedico> l);
    }

    ...
}

ただし、リストでは、挿入時にリストの順序を自分で維持する必要があることに注意してください。コレクションを自動的にソートしたい場合は、SortedSetが役立つ場合があります。インターフェースの実装であるTreeSetは、そのコンストラクターで を受け取り、その要素自体をソートします。SortedSetComparator

于 2009-11-06T16:16:44.130 に答える
2

Sun の Java インターフェイス トレイルに、オブジェクトの順序付けに関するページがあります。コンパレータの概要とその書き方について簡単に説明します。

于 2009-11-06T16:06:30.453 に答える
1
  1. 「手動で並べ替える」の代わりに、並べ替え方法を使用します。
  2. twolfe18で指摘されているように、Comparatorオブジェクトを使用して、Strategyデザインパターンの内部をよく見てください。
于 2009-11-06T16:29:05.437 に答える
1

リストの順序を変更したい場合は、引数としてコンパレーターを取るCollections.sort()メソッドを使用できます。

コードに基づいて、ComparableComparatorインターフェースの間に混乱があるようです。インターフェースを実装するクラスComparableは、ある種の自然な順序付けを持っていることを意味します (たとえば、Integerクラスは、それが表す int に基づいて自然に順序付けられます)。コンパレータを使用すると、他の順序付け基準に基づいてオブジェクトを順序付けできます。

あなたが投稿したコードから、実際に ElencoEsami クラスを注文するつもりなのか、それとも EsameMedico オブジェクトを注文するつもりなのかを尋ねたいと思います。

注文する必要があるのが EsameMedio クラスの場合、Comparable インターフェイスを実装する必要があるのは EsameMedico クラスです。addEsame() メソッドで行う比較が EsameMedico クラスの自然な順序付けであると仮定すると、EsameMedico で compareTo() メソッドを次のように実装できます。

public class EsameMedico implements Comparable<EsameMedico>{
  ...
  public int compareTo(Object o) {
    EsameMedico e = (EsameMedico)o;
    if(getData().after(e.getData())) {
        return 1;
    } else if(e.getData().after(getData())){
        return -1;
    } else {
        return 0;
    }
}

}

その後、 addEsame() メソッドを変更して、リストに単純に挿入し、各挿入後に Collections.sort() を呼び出すことができます。もちろん、より良いアプローチは、ArrayList ではなくTreeSetを使用することです。これを行うと、各 EsameMedico がその自然な順序に従って挿入され、自分で並べ替えを実行する必要がなくなります。

于 2009-11-06T15:58:03.843 に答える
1

addEsameオブジェクトを で追加しているときに、 を呼び出さずにオブジェクトを並べ替えたい場合は、並べ替えたいキーでCollections.sort()a を使用します。TreeMapオブジェクトが異なる場合は、TreeSet.

そして別のこと:

次のようにリストを宣言します。

private List<EsameMedico> a;

(またはMap、、、Setあなたが選んだものは何でも)

コンストラクターで初期化します。

a = new ArrayList<EsameMedico>();

(またはTreeMap...)

クラスを拡張すると、ElencoEsami奇妙な結果が生じるからです。

于 2009-11-06T16:18:52.820 に答える
0

この例は非常に便利です: http ://www.javabeat.net/tips/20-sorting-custom-types-in-java.html

私にとっての鍵は、次のようなComparatorクラスの例でした。

package tips.sort;

import java.util.Comparator;

public class MovieComparator implements Comparator<Movie>{

@Override
public int compare(Movie movie1, Movie movie2) {

    int rank1 = movie1.getRank();
    int rank2 = movie2.getRank();

    if (rank1 > rank2){
        return +1;
    }else if (rank1 < rank2){
        return -1;
    }else{
        return 0;
    }
}

}

于 2012-03-11T12:13:31.130 に答える