MultiFieldReportComparator

来源:互联网 发布:java获取字符串编码 编辑:程序博客网 时间:2024/04/30 18:35
  private String[] fieldNames;    private final static String LESS = "0";    private final static String EQUAL = "1";    private final static String GREATER = "2";    public final static String ASC = "ASC_";    public final static String DESC = "DESC_";    private final static String CLAIM_TYPE_FIELD_NAME = "claimCaseType";    public MultiFieldReportComparator(String... fieldNames) {        super();        this.fieldNames = fieldNames;    }    @SuppressWarnings("unchecked")    public int compare(BaseReportVo obj1, BaseReportVo obj2) {        int result = 0;        try {            StringBuilder fieldsWeight1 = new StringBuilder(fieldNames.length);            StringBuilder fieldsWeight2 = new StringBuilder(fieldNames.length);            //Compare each filed            for (String fieldName : fieldNames) {                //Decide field order                boolean isDesc = false;                if (fieldName.startsWith(ASC)) {                    isDesc = false;                    fieldName = fieldName.substring(ASC.length());                } else if (fieldName.startsWith(DESC)) {                    isDesc = true;                    fieldName = fieldName.substring(DESC.length());                }                Comparable obj1Field = null;                Comparable obj2Field = null;                if (CLAIM_TYPE_FIELD_NAME.equals(fieldName)) {                    obj1Field = this.getClaimTypeWeight(obj1);                    obj2Field = this.getClaimTypeWeight(obj2);                } else {                    obj1Field = (Comparable) PropertyUtils.getProperty(obj1, fieldName);                    obj2Field = (Comparable) PropertyUtils.getProperty(obj2, fieldName);                }                //Handle null                if (obj1Field != null && obj2Field == null) {                    obj1Field = Integer.MAX_VALUE;                    obj2Field = Integer.MIN_VALUE;                } else if (obj1Field == null && obj2Field != null) {                    obj1Field = Integer.MIN_VALUE;                    obj2Field = Integer.MAX_VALUE;                } else if (obj1Field == null && obj2Field == null) {                    obj1Field = Integer.MIN_VALUE;                    obj2Field = Integer.MIN_VALUE;                }                //Decide field weight                int fieldResult = isDesc ? obj2Field.compareTo(obj1Field) : obj1Field.compareTo(obj2Field);                if (fieldResult == 0) {                    fieldsWeight1.append(EQUAL);                    fieldsWeight2.append(EQUAL);                } else if (fieldResult > 0) {                    fieldsWeight1.append(GREATER);                    fieldsWeight2.append(LESS);                } else {                    fieldsWeight1.append(LESS);                    fieldsWeight2.append(GREATER);                }            }            //Compare total weight            result = fieldsWeight1.toString().compareTo(fieldsWeight2.toString());        } catch (IllegalAccessException e) {            e.printStackTrace();            LOG.error(e.getMessage(), e);        } catch (InvocationTargetException e) {            e.printStackTrace();            LOG.error(e.getMessage(), e);        } catch (NoSuchMethodException e) {            e.printStackTrace();            LOG.error(e.getMessage(), e);        } catch (Exception e) {            e.printStackTrace();            LOG.error(e.getMessage(), e);        }        return result;    }

 
原创粉丝点击