0

次の問題に対する最善の解決策を誰かが提案してください(これは私がコーディングしようとしているプログラムの一部です):

メンバー変数を持つクラス Foo と、Foo を拡張する別のクラス Bar があります。Bar はメンバー変数を追加します。Bar オブジェクトはコレクションに格納されているため、これらのオブジェクトをメンバー変数のいずれかで並べ替えたいと考えています。

compareTo() メソッドに引数として渡すことができるクラスのメンバー変数を含む列挙型を使用することを検討しましたが、列挙型は暗黙的に静的であるため、Bar または拡張する可能性のある他のクラスのメンバー変数にパラメーターを追加することはできません比較したいフー。たとえば、メンバー変数 'myVar' で 2 つの Bar クラスを比較したい場合、bar1.compareTo(bar2, MyEnum.MYVAR) のように呼び出し、クラスを myVar 値と比較します。各メンバー変数で並べ替えるには個別のメソッドを作成する必要があるかもしれないと考えていますが、Javaコレクションでアイテムを自動的にソートするためにcompareTo()を使用したい(と思います)。

それは私が問題を説明できるのと同じくらい明確ですが、おそらくこれを完全に間違った方法で達成しようとしています。任意のポインタをいただければ幸いです。

編集 - これは、Windows エクスプローラー ウィンドウの列をさまざまな属性 (更新日、ファイル名、サイズなど) で並べ替えるのと同様の動作です。

4

2 に答える 2

4

この特定の比較ロジックをカプセル化するには、代わりにComparatorを使用することをお勧めします。作成したいオブジェクトをできるだけ多くComparator比較するか、提案されているようComparatorに、決定されたフィールドに基づいて比較することができます。

複数のコンパレータを使用するか、1 つだけにするかはあなた次第ですが、複数のフィールドに基づいて複雑な比較を行いたい場合は、そのための特定のコンパレータを作成することをお勧めします。

于 2012-12-07T20:17:03.713 に答える
1

継承を使用して compareTo を実装するのは非常に注意が必要です。そんなことしないほうがいい。集約を使用すると、問題がなくなります。

class Bar {
  Foo foo;
  String barName;
  public getName() { return barName; }
}

さらに、別のコンパレータ メソッド (昇順降順、属性別など) が必要な場合は、 Comparator を定義します: (残念です。Eclipse を開いていません。構文が失敗する場合は修正してください)

public class BarComparator implements Comparator<Bar> {

      @Override
      public int compare(Bar b1, Bar b2) {
        if (b1.getName() == null && b2.getName() == null) {
          return 0;
        }
        if (b1.getName() == null) {
          return 1;
        }
        if (b2.getName() == null) {
          return -1;
        }
        return b1.getName().compareTo(b2.getName());
      }
    }
于 2012-12-07T20:13:13.060 に答える