6

列挙型:

 public enum ComponentType {
    INSTRUCTION, ACTION, SERVICE, DOMAIN, INTEGRATION,  OTHER, CONTEXT;
 }

クラスA:

 public class A
 {
    String name;
    ComponentType c;
    public A(String name, ComponentType c)
    {
      this.name = name;
      this.c = c;
    }

 }   

コード:

 List<A> l = new ArrayList<A>();
 l.add(new A("ZY", ACTION));  
 l.add(new A("ZY0", INSTRUCTION));  
 l.add(new A("ZY1", DOMAIN));  
 l.add(new A("ZY2", SERVICE));  
 l.add(new A("ZY3", INSTRUCTION));  
 l.add(new A("ZY4", ACTION));  

列挙型の順序に従ってリストを並べ替える方法は?

4

10 に答える 10

6

すでに提供されており、宣言の順序(値compareToに基づく)を反映しているenumメソッドに単純に委任する必要があります。ordinal

Collections.sort(list, (a1, a2) -> a1.getType().compareTo(a2.getType()));        

または、コンポーネントタイプが要素の「自然な順序」を提供すると思われる場合は、Aクラス自体を実装し、メソッドをそのクラスComparableに委任することもできます。compareToComponentType

于 2012-11-19T07:33:04.500 に答える
2

実装を比較可能にします。列挙型の名前で並べ替える場合は、次のcompareToメソッドを使用します。

public int compareTo(A a) {
    return a.c.getName().compareTo(c.getName());
}

列挙型を入力した順序で並べ替える場合は、序数の値を比較します。

public int compareTo(A a) {
    return a.c.ordinal().compareTo(c.ordinal());
}
于 2012-11-19T07:33:17.590 に答える
2

同じ問題が発生しましたが、Enumクラスを変更できず、順序が間違っていました。compareToそのため、列挙型オブジェクトでsimpleを使用できませんでした。解決策は非常に単純です。すべての列挙型フィールドにint値を割り当ててから、それを比較するだけです。

public class MyComparator implements Comparator<A> {

    @Override
    public int compare(A o1, A o2) {
        return Integer.compare(getAssignedValue(o1.getComponentType()), getAssignedValue(o2.getComponentType()));
    }

    int getAssignedValue(ComponentType componentType) {
        switch (componentType) {
            case OTHER:
                return 0;
            case CONTEXT:
                return 1;
            case SERVICE:
                return 2;
            case DOMAIN:
                return 3;
            case INTEGRATION:
                return 4;
            case ACTION:
                return 5;
            case INSTRUCTION:
                return 6;
            default:
                return Integer.MAX_VALUE;

        }
    }

}

その後:

Collections.sort(list, new MyComparator);
于 2018-04-29T12:23:41.813 に答える
1

キーによって自然にソートされるため、EnumMapを使用する必要があるようです。

public static void add(Map<ComponentType, List<A>> map, A a) {
    List<A> as = map.get(a.c);
    if(as == null) map.put(a.c, as = new ArrayList<A>());
    as.add(a);
}

Map<ComponentType, List<A>> map = new EnumMap<ComponentType, List<A>>(ComponentType.class);
add(map, new A("ZY", ComponentType.ACTION));
add(map, new A("ZY0", ComponentType.INSTRUCTION));
add(map, new A("ZY1", ComponentType.DOMAIN));
add(map, new A("ZY2", ComponentType.SERVICE));
add(map, new A("ZY3", ComponentType.INSTRUCTION));
add(map, new A("ZY4", ComponentType.ACTION));
于 2012-11-19T08:29:45.400 に答える
1

java.util.Collections.sortによると、これを行う1つの方法は次のとおりです。

  1. インターフェイスをclass A実装します。これには、メソッドComparableの記述が含まれます。int compare(A other)
  2. 電話Collections.sort(l);
于 2012-11-19T07:35:47.743 に答える
1

ENUMに基づいてクラスをソートする必要がある場合は、一貫性を保つために、ENUMのcompareTo(finalの場合)メソッドを使用する必要があります。

このメソッドをAクラスに追加すると、一貫した動作を維持するのに役立ちます。

@Override
public int compareTo(A o) {
    return this.c.compareTo(o.c);
}
于 2012-11-19T09:35:48.390 に答える
0

まず第一に-ジェネリックスの使用を開始します。だからあなたのコードは

List<A> l = new ArrayList<A>();

そしてあなたの質問のために、あなたのAクラスComparableに、ソートのための式を置くことができるメソッドcompareToを実装してオーバーライドさせてください。ここの例

于 2012-11-19T07:33:54.867 に答える
0

列挙型compareToはfinalのようであり、オーバーライドできませ ん。JavaのEnum finalでcompareToが使用されるのはなぜですか?

必要に応じて列挙型の順序でリストを並べ替えるCollections.sort()を実行するだけです

于 2012-11-19T07:36:01.877 に答える
0

これがあなたがしなければならないことです:

    List<A> l = new ArrayList<A>();
    l.add(new A("ZY", ComponentType.ACTION));  
    l.add(new A("ZY0", ComponentType.INSTRUCTION));  
    l.add(new A("ZY1", ComponentType.DOMAIN));  
    l.add(new A("ZY2", ComponentType.SERVICE));  
    l.add(new A("ZY3", ComponentType.INSTRUCTION));  
    l.add(new A("ZY4", ComponentType.ACTION));

    Collections.sort(l, new Comparator<A>()
    {
        @Override
        public int compare(A o1, A o2)
        {
            return o1.c.toString().compareTo(o2.c.toString());
        }
    });
于 2012-11-19T07:36:41.313 に答える
0

まず第一に、List<Enum, Collection>これは不可能であるため、あなたは持っていません、あなたはList<A>それを次のように宣言する必要があります:

List<A> list = new LinkedList<>();

インターフェイスでインスタンス化しようとしていますが、これは不可能であり、コンパイル時エラーです。

のリストを並べ替える場合Aは、比較可能なものを作成する必要があります。

public class A implements Comparable<A>

compareTo()次のようにメソッドをオーバーライドします。

@Override
public int compareTo(A other) {
    return c.ordinal() - other.c.ordinal();
}

リストを並べ替えるには、次のように呼び出します。

Collections.sort(list);

于 2012-11-19T07:45:12.107 に答える