2014-11-14 4 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

큰 코드 더미입니다. 문제를보기 위해 모든 것이 필요합니까? 나는 의심하지 않는다. 문제를 표시하는 데 필요한 최소한의 코드로 줄일 수 있습니까? –

답변

0

내 생각 엔 데이터 문제입니다. 같은 값 (이유?)으로 ComparatorConstants.LESS_THAN을 반환합니다. 이는 동일한 데이터가 임의로 정렬됨을 의미합니다.

동일한 값보다 작은 값을 반환하면 정렬 알고리즘이이 경우에 관대하지 않을 경우 무한 루프가 발생할 위험이 있습니다.

필드가 올바르게 채워지고 올바른 이름으로 참조하고 있습니까?

관련 문제