Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较国一般合同违约_Java_Sorting_Collections - Fatal编程技术网

Java 比较国一般合同违约

Java 比较国一般合同违约,java,sorting,collections,Java,Sorting,Collections,我已经阅读了所有关于可传递比较器的线程,我不明白为什么这个比较器函数违反了规则。如果有人能清洁我的眼睛,我想这很简单,但我无法做到 堆栈是: java.util.TimSort.mergeLo(TimSort.java:747) java.util.TimSort.mergeAt(TimSort.java:483) java.util.TimSort.mergeCollapse(TimSort.java:410) 我的目标简化了 public class SleepDetails {

我已经阅读了所有关于可传递比较器的线程,我不明白为什么这个比较器函数违反了规则。如果有人能清洁我的眼睛,我想这很简单,但我无法做到

堆栈是:

java.util.TimSort.mergeLo(TimSort.java:747)
java.util.TimSort.mergeAt(TimSort.java:483)
java.util.TimSort.mergeCollapse(TimSort.java:410)
我的目标简化了

public class SleepDetails  {
    private DateTime time;
    private SleepEnum type;
    [...]
}

public enum SleepEnum {
    DEEP(0), LIGHT(1), AWAKE(2), BEGIN(16), END(17);
    [...]
}
比较器将一个静态对象转换为一个类

Comparator<SleepDetails> comparator = new Comparator<SleepDetails>(){
        public int compare(SleepDetails arg0, SleepDetails arg1) {
            int res = arg0.getTime().compareTo(arg1.getTime());
            if (res != 0)
                return res;
            if (arg0.getType() == arg1.getType())
                return 0;
            switch(arg0.getType()) {
              case BEGIN:
                return -1;
              case END:
                return 1;
              default:
                return 0;
            }
        }
    };
我主要想按日期对事件进行排序,如果两个事件的日期时间相同,则将begin事件放在第一位,将end事件放在最后一位

如果比较两个具有相同getTime的SleepDetails实例,其中一个具有getType BEGIN,另一个具有AWAKE,则我没有触发错误的集合

compare (one, two)
将给出-1

compare (two, one)
将给出0

这违反了合同:

实现者必须确保所有x和y的sgncomparex,y==-sgncomparey,x

每当arg0.getType既不是开始也不是结束时,还必须在比较方法中检查arg1.getType

    public int compare(SleepDetails arg0, SleepDetails arg1) {
        int res = arg0.getTime().compareTo(arg1.getTime());
        if (res != 0)
            return res;
        if (arg0.getType() == arg1.getType())
            return 0;
        switch(arg0.getType()) {
          case BEGIN:
            return -1;
          case END:
            return 1;
          default:
            switch(arg1.getType()) {
              case BEGIN:
                return 1;
              case END:
                return -1;
              default:
                return 0;
            }
        }
    }
如果比较两个具有相同getTime的SleepDetails实例,其中一个具有getType BEGIN,另一个具有唤醒

compare (one, two)
将给出-1

compare (two, one)
将给出0

这违反了合同:

实现者必须确保所有x和y的sgncomparex,y==-sgncomparey,x

每当arg0.getType既不是开始也不是结束时,还必须在比较方法中检查arg1.getType

    public int compare(SleepDetails arg0, SleepDetails arg1) {
        int res = arg0.getTime().compareTo(arg1.getTime());
        if (res != 0)
            return res;
        if (arg0.getType() == arg1.getType())
            return 0;
        switch(arg0.getType()) {
          case BEGIN:
            return -1;
          case END:
            return 1;
          default:
            switch(arg1.getType()) {
              case BEGIN:
                return 1;
              case END:
                return -1;
              default:
                return 0;
            }
        }
    }

问题在于,代码没有区分除BEGIN和END之外的类型的枚举值。特别是,当第一个类型既不是BEGIN也不是END时,不管第二个类型是什么,它都返回零

但是,这种行为是不对称的:如果您交换一对中的两个项BEGIN和LIGHT,您将得到-1和0,从而破坏对称性


您可以将除BEGIN和END之外的所有类型视为彼此相等,但在确定相等性时,您需要使用两边。

问题在于,您的代码没有区分BEGIN和END之外的类型的枚举值。特别是,当第一个类型既不是BEGIN也不是END时,不管第二个类型是什么,它都返回零

但是,这种行为是不对称的:如果您交换一对中的两个项BEGIN和LIGHT,您将得到-1和0,从而破坏对称性


您可以将除BEGIN和END之外的所有类型视为彼此相等,但在确定相等时,您需要使用两边。

switcharg0.getType-您没有进行比较。呃@Bene什么?类似的方法肯定不会遵循这一点。整数。比较1,2!=整数。比较2,1。事实上,它们只有在相同的情况下才是匹配的。我糟糕的,不同的storyswitcharg0.getType-你不是在比较。呃@Bene什么?类似的方法肯定不会遵循这一点。整数。比较1,2!=整数。比较2,1。事实上,只有当他们是一样的时候,他们才是匹配的。我的糟糕,不同的故事