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