Java:了解Comparator的工作原理(返回-1和0)

这是代码

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        Arrays.sort(logs,(s1,s2) -> {
            String[] split1 = s1.split(" ",2);
            String[] split2 = s2.split(" ",2);

            boolean isDigit1 = Character.isDigit(split1[1].charAt(0));
            boolean isDigit2 = Character.isDigit(split2[1].charAt(0));

            if(!isDigit1 && !isDigit2) {
                // both letter-logs. 
                int comp = split1[1].compareTo(split2[1]);
                if (comp == 0) return split1[0].compareTo(split2[0]);
                else return comp;
            } else if (isDigit1 && isDigit2) {
                // both digit-logs. So keep them in original order
                return 0; 
            } else if (isDigit1 && !isDigit2) {
                // first is digit,second is letter. bring letter to forward.
                return 1;
            } else {
                //first is letter,second is digit. keep them in this order.
                return -1; 
            }
        });
        return logs;
    }
}

这是问题说明

您有一系列日志。每个日志都是用空格分隔的字符串。

对于每个日志,每个日志中的第一个单词都是字母数字标识符。然后,要么:

Each word after the identifier will consist only of lowercase letters,or;
Each word after the identifier will consist only of digits.

我们将这两种日志称为字母日志和数字日志。确保每个日志的标识符后至少有一个单词。

对日志重新排序,以使所有字母日志排在任何数字日志之前。字母日志按字典顺序忽略标识符,并在平局的情况下使用标识符。数字日志应按原始顺序放置。

返回日志的最终顺序。

示例1:

Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
Output: ["let1 art can","let3 art zero","dig1 8 1 5 1","dig2 3 6"]

我的查询

我不明白的是,返回0和返回-1之间的区别

在比较时,我以为-1不会改变两个对象的原始顺序,但是返回0却可以完成同样的事情。那么,实际区别是什么?谢谢

yujian1314 回答:Java:了解Comparator的工作原理(返回-1和0)

虽然Comparable<T>的{​​{1}}方法将int compareTo(T o)与指定对象进行比较,而this的{​​{1}}比较相同类型的两个不同实例。两种方法具有相同的数学契约。如Joshua Bloch在“有效Java”中所述:

当此对象小于,等于或大于指定的对象时,返回负整数,零或正整数。如果指定对象的类型阻止将其与该对象进行比较,则抛出Comparator<T>

在下面的描述中,符号int compare(T o1,T o2)指定数学的ClassCastException函数,该函数根据表达式的值为负,零,返回-1、0或1而定义,或肯定的。

•实现者必须确保所有x和y的sgn(expression)。 (这意味着signum仅在sgn(x.compareTo(y)) == -sgn(y.compareTo(x))引发异常时才必须引发异常。)

•实现者还必须确保该关系是可传递的:x.compareTo(y)暗含y.compareTo(x)

•最后,实现者必须确保(x.compareTo(y) > 0 && y.compareTo(z) > 0)暗示 x.compareTo(z) > 0,用于所有z。

•强烈建议(但并非必须)使用x.compareTo(y) == 0。一般来说,任何实现Comparable接口并且违反此条件的类都应明确表明这一事实。

,

对于ComparatorComparable等,传递了两个参数。如果第二个参数较大,则返回任何负数;如果相等,则返回0;如果第一个参数较大,则返回正数。负数和正数不必为-1或1。例如,如果您要比较哪个数字更大,compare(5,10)将返回负数,例如-1,因为10大于5。

本文链接:https://www.f2er.com/2595019.html

大家都在问