【问题标题】:Ignore sorting of two objects if the two sort object contain a value如果两个排序对象包含一个值,则忽略两个对象的排序
【发布时间】:2017-10-02 08:22:29
【问题描述】:

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

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 任务类型的函数中,不要执行排序。任何人都可以帮助我在我的方法中出错的地方。

【问题讨论】:

  • 比较器不排序,它只是确定两个值中哪个更小。
  • 你的 time1time2 总是积极的吗?
  • 确定的值是多少?
  • 完成。非常感谢

标签: java sorting comparator


【解决方案1】:

我不知道细节,所以我会这样解决它:

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

比较器

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(List list, 比较器 c) 根据指定比较器产生的顺序对指定列表进行排序。全部 列表中的元素必须使用指定的相互比较 比较器(即 c.compare(e1, e2) 不能抛出 列表中任何元素 e1 和 e2 的 ClassCastException)。这种 保证稳定:相等的元素不会被重新排序为 排序结果。

【讨论】:

  • 它不会是传递的。想象 3 个对象 a、b、c。其中一个具有此属性(假设为 b)。那么a = b and b = c then a = c,这意味着所有对象都必须相等。
  • 对。恐怕是规格问题。
  • 不是。如果您使该特殊对象彼此相等且小于所有其他对象,则它仍然是可传递的。
  • OP 写道:“如果两个 objetc 中的任何一个具有 cretain 值,那么我不希望比较器对该调用中的列表进行排序。”。从字面上看,这是没有意义的,即比较器不对列表进行排序。所以,如果我们试图猜测他真正想要什么,那么我们就只能靠自己了。我的猜测是他不想移动具有特定价值的对象。即使它使排序不传递。
猜你喜欢
  • 2015-07-02
  • 2020-05-24
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多