我想对对象数组进行排序。每个对象都有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 :(得分: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
}
};