2014-11-14 68 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(爲什麼?)這意味着等價數據將被任意排序。

如果排序算法不能容忍這種情況,那麼返回小於等於同樣的值也會導致引入無限循環的風險。

你確定這些欄位填寫正確,而你是用正確的名稱來引用它們嗎?