类型组的比较器

时间:2013-03-04 08:55:43

标签: java comparator

我想对对象数组进行排序。每个对象都有getType()方法,该方法返回String中的对象类型。

我想根据类型优先级对数组进行排序。

示例:

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 个答案:

答案 0 :(得分: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的<{1}}方法:

Comparator

UPDATE:更清洁的方法是在基类中定义hashmap(声明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

答案 1 :(得分: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及更高版本,因为在Java 7之前不支持switch上的String

如果您没有运行Java 7,则必须使用if语句而不是switch

答案 2 :(得分:1)

让你的对象Comparable<ElementType>接口(因为它们都是同一个类(比如ElementType)和调用Arrays.sort(myArray)。如果你想使用不同的顺序对对象进行排序每次,你应该创建一个Comparator对象

你可以看到很好的例子here

答案 3 :(得分:0)

您还可以考虑使用Guava's Ordering类为您排序输入。如果您正在处理的对象具有“自然”顺序的概念,那么您可以执行类似Ordering<Input>.natural的操作或在实例化中实现您自己的比较器:

Ordering<Input> getInputOrder = new Ordering<Input>() {
 public int compare(Input A, Input B) {
   return A.comparableMember > B.comparableMember
 }
};