如果两个排序对象包含值,则忽略对两个对象的排序

时间:2017-10-02 08:22:29

标签: java sorting comparator

我正在使用自定义比较器对列表进行排序。

Collections.sort(list, new DispositionShiftSortComparator(shiftSortComparatorIndex));

在比较功能中,如果两个objetc中的任何一个具有cretain值,那么我不希望比较器对该调用中的列表进行排序。

功能如下:

           boolean taskStatusObj1 = false, taskStatusObj2 = false;
            long time1 = 0, time2 = 0;
            for (int i = 0; i < o1.getValue().getTaskCount(); i++) {
                if (o1.getValue().getTask(i).getObject() instanceof TaskObject) {
                    TaskObject obj1 = (TaskObject)o1.getValue().getTask(i).getObject();
                    if (obj1 != dndTask) {
                        taskStatusObj1 = ((TaskObject)o1.getValue().getTask(i).getObject()).getSafeDataItem(DataKey.DK_TASK_STATE).stringValue() != null ? true : false;
                    }
                }
            }
            for (int i = 0; i < o2.getValue().getTaskCount(); i++) {
                if (o2.getValue().getTask(i).getObject() instanceof TaskObject) {
                    TaskObject obj2 = (TaskObject)o2.getValue().getTask(i).getObject();
                    if (obj2 != dndTask) {
                        taskStatusObj2 = ((TaskObject)o2.getValue().getTask(i).getObject()).getSafeDataItem(DataKey.DK_TASK_STATE).stringValue() != null ? true : false;
                    }
                }
            }
            if (taskStatusObj1) {
                new Date(o1.getValue().getTask(o1.getValue().getTaskCount() - 1).getEndTime());
                time1 = o1.getValue().getTask(o1.getValue().getTaskCount() - 1).getEndTime();
            } else {
                time1 = 0;
            }
            if (taskStatusObj2) {
                new Date(o2.getValue().getTask(o2.getValue().getTaskCount() - 1).getEndTime());
                time2 = o2.getValue().getTask(o2.getValue().getTaskCount() - 1).getEndTime();
            } else {
                time2 = 0;
            }
            if (time1 != 0 && time2 != 0) {
                return -(int) (time1 - time2);
            } else if (time1 != 0 && time2 == 0) {
                return (int) time1;
            } else if (time1 == 0 && time2 != 0) {
                return (int) -time2;
            }
            return 0;
        } 

在我检查对象不是dnd任务类型的函数中,不要进行排序。在我的方法中,任何人都可以帮助我。

1 个答案:

答案 0 :(得分:0)

我不知道细节,所以我要解决这个问题:

  1. 写一个Comparator,如果任何对象包含该特定值,则返回0
  2. 使用stable sorting method,即不会改变相等项目的顺序。
  3. 比较器

    public class DispositionShiftSortComparator<DispositionShif> {
    
        @Override
        public int compare(DispositionShift shift1, DispositionShift shift2) {
            if ((shift1 != null && containsCertainValue(shift1)) || (shift != null) && containsCertainValue(shift2)) {
                return 0;
            }
            // ... do the rest as you did
        }
    }
    

    正确的排序算法

    Collections.sort()保证稳定。这很简单:

      

    public static void sort(列表列表,               比较器c)根据指定比较器引起的顺序对指定列表进行排序。所有   列表中的元素必须使用指定的内容进行相互比较   比较器(即c.compare(e1,e2)不得抛出一个   列表中任何元素e1和e2的ClassCastException。这种   保证稳定:相同的元素不会被重新排序为a   结果的结果。