使用自定义顺序使用多个字符串字段对可比对象列表进行排序

时间:2018-06-29 09:28:22

标签: java sorting comparable

使用此类:

public class MyClass implements Comparable<MyClass> {

    private String status;
    private String name;
    private String firstName;  

    @Override
    public int compareTo(MyClass o) {
        return 0;
    }

}

我想按以下顺序对MyClass对象列表进行排序:

  • 首先,状态=“打开”,然后“工作”,然后“关闭”
  • 第二,名称=“ toto”,然后是“ titi”
  • 最后,firstName =“ tutu”,“ tata”

如何使用Comparable界面执行此操作?

1 个答案:

答案 0 :(得分:0)

我将这样做:首先定义一组列表,这些列表定义每个字段的顺序:

private static List<String> statusOrder = Arrays.asList("open", "working", "close");
private static List<String> nameOrder = Arrays.asList("toto", "titi");
private static List<String> firstNameOrder = Arrays.asList("tutu", "tata");

然后使用List.indexOf获取元素在列表中的位置,然后简单地减去结果:

@Override
public int compareTo(MyClass o) {
    final int statusComp = statusOrder.indexOf(status) - statusOrder.indexOf(o.status);
    if (statusComp != 0) return statusComp;
    final int nameComp = nameOrder.indexOf(name) - nameOrder.indexOf(o.name);
    if (nameComp != 0) return nameComp;
    return firstNameOrder.indexOf(firstName) - firstNameOrder.indexOf(o.firstName);
}

此方法的问题在于,如果元素不在列表中,则indexOf将返回-1。在MyClass包含非标准值(也许永远不会发生)的情况下,您需要定义行为。