比较器未正确排序 - java

我正在尝试编写一个测试来强调以下类的行为。它是网站的比较器,但是由于某些原因,“ 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);
    }
}

我花了几个小时查看代码并进行实验,但找不到错误所在。除了实现该类的测试之外,我还想修复它,但是找不到问题。我将非常感谢任何提示。

谢谢!

java大神给出的解决方案

我的猜测:这是一个数据问题。您以相等的值返回ComparatorConstants.LESS_THAN(为什么?),这意味着将任意排序等效数据。

如果排序算法不容许这种情况,则返回小于等于的值还可能导致引入无限循环。

您确定正确填写了这些字段,并且使用正确的名称来引用它们吗?

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

如何在JAVA中传递以逗号分隔的值作为函数参数的字符串 - java

我有一个可以接受任何数量的INTEGER参数的方法:pages(int,int...)此方法是选择PDF文件的某些页面。以以下字符串类型存储的书页:String pages = "1,2,3,6,9"; 我想将此字符串作为方法的参数看起来像:pages(1,2,3,6,9); java大神给出的解决方案 使用流可以很容易地做到这一点:St…

java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…