4

異なるクラスの列挙型を注文する方法があるかどうか疑問に思っていました。たとえば、他の化学物質とは異なる方法で反応する化学物質の固定グループがあるとします。あるものは強く、あるものは弱く反応します。私は基本的に、グループが反応するはずの化学物質に応じて(つまり、クラスに応じて)、それらが配置される順序を切り替えることができるようにしたいと考えています。Comparable を使用することになっていることは知っていますが、その方法がわかりません。よくわからない場合は、コメントを残してください。さらに説明します。

ありがとう。

public static enum Chem {
    H2SO4, 2KNO3, H20, NaCl, NO2
};

だから私はそのように見えるものを持っていて、それぞれの化学物質が他の化学物質にどのように反応するかをすでに知っています. 反応する化学物質に基づいて化学物質を配置したいだけです。それは私が持っているほとんどすべてです。

4

5 に答える 5

10

異なる を実装します ( http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.htmlComparatorを参照) 。

Comparator comparator1 = new Comparator<MyEnum>() {

  public int compare(MyEnum e1, MyEnum e2) {
     //your magic happens here
     if (...)
       return -1;
     else if (...)
       return 1;

     return 0;
  }
};

//and others for different ways of comparing them

//Then use one of them:
MyEnum[] allChemicals = MyEnum.values();
Arrays.sort(allChemicals, comparator1); //this is how you sort them according to the sort critiera in comparator1.
于 2012-05-05T22:57:51.567 に答える
4

これは、異なる基準に従ってソートされた列挙型の同じ値を示す例です。

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortEnum {

    public enum TestEnum {
        A(1, 2), B(5, 1), C(3, 0);
        private int value1;
        private int value2;

        private TestEnum(int value1, int value2) {
            this.value1 = value1;
            this.value2 = value2;
        }

        public int getValue1() {
            return value1;
        }

        public int getValue2() {
            return value2;
        }
    }

    public static void main(String[] args) {
        List<TestEnum> list = Arrays.asList(TestEnum.values());
        System.err.println(list);
        Collections.sort(list, new Comparator<TestEnum>() {
            @Override
            public int compare(TestEnum o1, TestEnum o2) {
                return o1.getValue1() - o2.getValue1();
            }
        });
        System.err.println(list);
        Collections.sort(list, new Comparator<TestEnum>() {
            @Override
            public int compare(TestEnum o1, TestEnum o2) {
                return o1.getValue2() - o2.getValue2();
            }
        });
        System.err.println(list);
    }
}

出力は

[A、B、C] [A、C、B] [C、B、A]

于 2012-05-05T23:00:27.633 に答える
2

要素の列挙型があるとします。

enum Elements {Oxygen, Hydrogen, Gold}

そして、あなたはそれらを与えられた順序でソートしたいので、私は次のことができます:

Elements[] myElements = Elements.values();
Arrays.sort(myElements, new ElementComparator());

ElementComparator次のような場所になります。

public class ElementComparator implements java.util.Comparator<Elements> {
    public int compare(Elements left, Elements right){
        return right.compareTo(left); //use your criteria here
    }
}

注文基準の性質はあなたの質問では明確ではありません。化学反応に関係しているようです。Comparator化学反応が与えられた場合、どの列挙型要素が他の列挙型要素よりも大きいかを決定するための基準を設定する必要があると思います。

于 2012-05-05T22:58:26.653 に答える
0

あなたの化学物質を表す実際のオブジェクトは列挙型ですか?私が言うかもしれないが、それは奇妙な実装のようにすごいです:列挙型は何かの「プロパティ」に本当に適しています。

しかしとにかく...本当に列挙型として表現してから並べ替える場合は、特定のタイプの列挙型を並べ替えることができるコンパレータを実装してから、compare()メソッドで適切な比較を行うことをお勧めします。

Comparator<Chemical> comp = new Comparator<Chemical>() {
    public int compare(Chemical o1, Chemical o2) {
        if (o1.reactivity() > o2.reactivity()) {
          return 1;
        } else if (o1.reactivity() < o2.reactivity()) {
          return -1;
        } else {
        return integer depending on whatever else you want to order by...
        }
    }
};

次に、このコンパレータを、関連するsortメソッド、順序付きコレクションコンストラクタなどに渡すことができます。

enumサブクラスを拡張して、reactivity()などの必要な追加のメソッドを含めることができます。

于 2012-05-05T22:58:44.450 に答える