2014-11-14 79 views
3

我想写一个测试,以强调下面的类的行为。它是网站的比较器,但由于某些原因,“propertiesCreatedBy”部分不起作用。这是一个很奇怪的问题,只要字段的其余工作,可以适当进行排序,而是试图通过此列进行排序时的顺序似乎是随机的:比较器没有正确排序

 import java.io.Serializable; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 


public class CaseNoteDTOComparator implements Comparator, Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    protected class CaseNoteDTOComparatorInternal implements Serializable { 
     private String[] properties = null; 
     boolean[] shouldReverse = null; 

     public CaseNoteDTOComparatorInternal(String[] properties, boolean[] shouldReverse) { 
      this.properties = properties; 
      this.shouldReverse = shouldReverse; 
     } 

     public int compare(Object obj1, Object obj2) { 
      int result = 0; 
      for (int i = 0; i < properties.length; i++) { 
       JavaBeanNamedPropertyComparator comparator = 
        new JavaBeanNamedPropertyComparator(properties[i], shouldReverse[i]); 
       result = comparator.compare(obj1, obj2); 
       if(result != ComparatorConstants.EQUAL) { 
        return result; 
       } 
      } 
      //actually object are equals.... 
      return ComparatorConstants.LESS_THAN; 
     } 

     public void setDescending(boolean descending) { 
      for (int i = 0; i < shouldReverse.length; i++) { 
       shouldReverse[i] = descending; 
      } 
     } 
    } 

    private static Map comparators = new HashMap(); 

    //statically initialise comparators 
    { 
     final String[] propertiesEffectiveDate = { EFFECTIVE_DATE_NAME, CREATED_ON }; 
     boolean[] shouldReverseEffectiveDate= {false, false}; 
     comparators.put(EFFECTIVE_DATE_NAME, new CaseNoteDTOComparatorInternal(propertiesEffectiveDate, shouldReverseEffectiveDate)); 

     final String[] propertiesId = { ID_NAME }; 
     boolean[] shouldReverseId = {false}; 
     comparators.put(ID_NAME, new CaseNoteDTOComparatorInternal(propertiesId, shouldReverseId)); 

     final String[] propertiesType = { TYPE_NAME, ID_NAME }; 
     boolean[] shouldReverseType = {false, false}; 
     comparators.put(TYPE_NAME, new CaseNoteDTOComparatorInternal(propertiesType, shouldReverseType)); 

     final String[] propertiesTitle = { TITLE_NAME, ID_NAME }; 
     boolean[] shouldReverseTitle = {false, false}; 
     comparators.put(TITLE_NAME, new CaseNoteDTOComparatorInternal(propertiesTitle, shouldReverseTitle)); 

     final String[] propertiesRecordedVS = { PERSON_LASTNAME_NAME, PERSON_FIRSTNAME_NAME, ID_NAME }; 
     boolean[] shouldReverseRecordedVS= {false, false, false}; 
     comparators.put(RECORDED_VS, new CaseNoteDTOComparatorInternal(propertiesRecordedVS, shouldReverseRecordedVS)); 

     final String[] propertiesCreatedBy = { CREATED_BY_LASTNAME_NAME, CREATED_BY_FIRSTNAME_NAME, ID_NAME }; 
     boolean[] shouldReverseCreatedBy= {false, false, false}; 
     comparators.put(CREATED_BY_NAME, new CaseNoteDTOComparatorInternal(propertiesCreatedBy, shouldReverseCreatedBy)); 

     final String[] propertiesOrganisation = { ORGANISATION_NAME, ID_NAME }; 
     boolean[] shouldReverseOrganisation= {false, false}; 
     comparators.put(ORGANISATION_NAME, new CaseNoteDTOComparatorInternal(propertiesOrganisation, shouldReverseOrganisation)); 

     final String[] propertiesScore = { LUCENE_INDEX_SCORE}; 
     boolean[] shouldReverseScore = {false}; 
     comparators.put(LUCENE_INDEX_SCORE, new CaseNoteDTOComparatorInternal(propertiesScore, shouldReverseScore)); 

    } 

    private CaseNoteDTOComparatorInternal comparator = null; 

    public static final String ID_NAME = "id"; 
    public static final String EFFECTIVE_DATE_NAME = "effectiveDate"; 
    public static final String TYPE_NAME = "displayCaseNoteType"; 
    public static final String TITLE_NAME = "title"; 
    public static final String PERSON_LASTNAME_NAME = "personLastName"; 
    public static final String PERSON_FIRSTNAME_NAME = "personFirstName"; 
    public static final String RECORDED_VS = "recordedVS"; 
    public static final String CREATED_BY_NAME = "createdBy"; 
    public static final String CREATED_BY_FIRSTNAME_NAME = "createdByFirstName"; 
    public static final String CREATED_BY_LASTNAME_NAME = "createdByLastName"; 
    public static final String CREATED_ON = "createdOn"; 
    public static final String ORGANISATION_NAME = "organisationName"; 
    public static final String DEFAULT_FIELD_NAME = EFFECTIVE_DATE_NAME; 
    public static final String LUCENE_INDEX_SCORE = "score"; 

    public CaseNoteDTOComparator(String fieldKeyName, boolean descending) { 
     this.comparator = (CaseNoteDTOComparatorInternal)comparators.get(fieldKeyName); 
     if(comparator==null) { 
      this.comparator = (CaseNoteDTOComparatorInternal)comparators.get(DEFAULT_FIELD_NAME); 
     } 
     comparator.setDescending(descending); 
    } 

    public int compare(Object obj1, Object obj2) { 

     return comparator.compare(obj1, obj2); 
    } 
} 

我花了几个小时在看代码和进行实验,但无法找到问题所在。除了为课堂实施测试之外,我想解决它,但找不到问题。我会很感激任何提示。

谢谢!

+2

这是一大堆代码 - 我们是否需要所有这些才能看到您的问题?我怀疑不是。你能把它缩小到向我们展示问题所需的最小代码吗? – 2014-11-17 10:51:05

回答

0

我的猜测:这是一个数据问题。你为什么返回ComparatorConstants.LESS_THAN(为什么?)这意味着等价数据将被任意排序。

如果排序算法不能容忍这种情况,那么返回小于等于同样的值也会导致引入无限循环的风险。

你确定这些栏位填写正确,而你是用正确的名称来引用它们吗?