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());

以上仅适用于 Java 7 及更高版本,因为switchStringJava 7 之前不支持 on。

如果您没有运行 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 回答