2013-03-04 64 views
0

我想排序对象的数组。每个对象都有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 } 

应该如何我比较像?

如果我还没有明确说明我的问题,请写下评论,我会尽量简单说明不清楚的部分。

+0

是'type'一个字符串值 – 2013-03-04 08:57:57

+3

为什么你的输出开始{A,C,D}? {D,A,C}很容易吗?即您的小组内的所有元素是否有效平等?你有什么尝试? – 2013-03-04 08:58:07

+1

你是同一类的所有对象还是至少继承了同一个接口/类?或者它们都是不同的类(每种类型代表不同的类)? – Dukeling 2013-03-04 09:05:34

回答

3

可以声明一个优先散列映射:

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

然后实现您的Comparatorcompare方法:

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

UPDATE:清洁的方法是在你的基类来定义的HashMap(其中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); 
} 
+1

我发现,您的答案最有用。感谢您花时间查看我的答案并分享您的知识! – Datenshi 2013-03-04 09:44:15

+0

@Dennshi谢谢!祝你好运! – 2013-03-04 09:48:46

1

有你的对象Comparable<ElementType>接口(因为都是同一类的(可以说ElementType和呼叫Arrays.sort(myArray)。如果要排序的对象,每次使用不同的不同的顺序,那么你应该创建一个Comparator对象

你可以看到很好的例子here

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和工作,因为switch上在Java 7之前不支持。

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

+0

你的回答是正确的,但我认为默认的语言环境更好,所以我会接受他的回答。但是,谢谢你的时间和有用的答案,以及:-) – Datenshi 2013-03-04 09:45:13

0

您也可以考虑使用Guava'sOrdering类进行排序输入你。如果你正在处理的对象有一个“自然”秩序的概念,那么你可以这样做Ordering<Input>.natural或实现自己的比较实例化内部:

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