0

オブジェクトの配列をソートしたいと思います。各オブジェクトにはgetType()、オブジェクトの型を文字列で返すメソッドがあります。

優先度のようなもので、タイプに応じて配列をソートしたいと思います。

例:

Input { A, F, Z, G, E, D, C }

If(type == A or B or C or D) top 
If(type == E) second
If(type == F or G) third
If(differet type) last

Output: { A, C, D, E, F, G, Z }

私のコンパレータはどのように見えるべきですか?

私の質問が十分に明確に述べられていない場合は、コメントを書いてください。明確でない部分をより簡単に説明しようとします。

4

4 に答える 4

4

優先度ハッシュ マップを宣言できます。

private static final HashMap<String,Integer> PRIORITIES = new HashMap<String, Integer>();
static{
    PRIORITIES.put("A", 1);
    PRIORITIES.put("B", 1);
    PRIORITIES.put("C", 1);
    PRIORITIES.put("D", 1);
    PRIORITIES.put("E", 2);
    PRIORITIES.put("F", 2);
    PRIORITIES.put("G", 3);
}

compare次に、あなたのメソッドを実装しますComparator

private int getPriority(CustomClass obj) {
    if(obj!=null&&PRIORITIES.containsKey(obj.getType())) {
        priority1 = PRIORITIES.get(obj.getType());
    } else {
        priority1 = Integer.MAX_VALUE;
    }
}

@Override
public int compare(CustomClass o1, CustomClass o2) {
    int priority1,priority2;
    priority1 = getPriority(o1);
    priority2 = getPriority(o2);
    return priority1==priority2 ? 0 : (priority1<priority2 ? -1 : 1);
}

更新:よりクリーンなアプローチは、基本クラス(getType宣言されている場所)でハッシュマップを定義し、メソッドを実装getPriorityすることです:

public int getPriority() {
    return PRIORITIES.containsKey(getType()) ? PRIORITIES.get(getType()) : Integer.MAX_VALUE;
}

それからComparator明らかです:

@Override
public int compare(CustomClass o1, CustomClass o2) {
    int priority1,priority2;
    priority1 = o1==null ? Integer.MAX_VALUE : o1.getPriority();
    priority2 = o2==null ? Integer.MAX_VALUE : o2.getPriority();
    return priority1==priority2 ? 0 : (priority1<priority2 ? -1 : 1);
}
于 2013-03-04T09:12:26.343 に答える
2

私はおそらく次のようなことをするでしょう:

class Comparer implements Comparator<YourType>
{
   @Override
   public int compare(YourType o1, YourType o2)
   {
      return Integer.compare(getRank(o1), getRank(o2));
      // Pre-Java 7
      //Integer v1 = getRank(o1);
      //return v1.compareTo(getRank(o2));
   }

   int getRank(YourType o)
   {
      switch (o.getType())
      {
         case "A": case "B": case "C": case "D":
            return 1;
         case "E":
            return 2;
         case "F": case "G":
            return 3;
         default:
            return 4;
      }
   }
}

それで:

YourType[] arr = ...;
Arrays.sort(arr, new Comparer());

switchonStringは Java 7 より前ではサポートされていないため、上記は Java 7 以降でのみ機能します。

Java 7 を実行していない場合は、. の代わりに if ステートメントを使用する必要がありますswitch

于 2013-03-04T09:12:48.570 に答える
1

オブジェクトのComparable<ElementType>インターフェースを用意します(それらはすべて同じクラスであるため(ElementType 呼び出しとしArrays.sort(myArray)ましょう。毎回異なる順序でオブジェクトを並べ替えたい場合は、オブジェクトを作成する必要がありComparatorます)

ここで素敵な例を見ることができます

于 2013-03-04T09:12:27.997 に答える
0

Guavaの Orderingクラスを使用して、入力を並べ替えることも検討できます。扱っているオブジェクトが「自然な」順序の概念を持っている場合はOrdering<Input>.natural、インスタンス化の内部で次のようなことを行うか、独自のコンパレータを実装できます。

Ordering<Input> getInputOrder = new Ordering<Input>() {
 public int compare(Input A, Input B) {
   return A.comparableMember > B.comparableMember
 }
};
于 2013-03-04T09:30:09.003 に答える