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

问题描述 投票:0回答:1

这里是代码

 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","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

我的查询

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

我认为是-1时,比较时不会改变两个对象的原始顺序,但是返回0会执行相同的操作。那么,实际区别是什么?谢谢

java compare comparator comparable
1个回答
0
投票

Comparable<T>int compareTo(T o)方法将this与指定对象进行比较,而Comparator<T>int compare(T o1, T o2)比较相同类型的两个不同实例。两种方法具有相同的数学契约。如Joshua Bloch在“有效Java”中提到的那样:

返回一个负整数,零或正整数,因为此对象小于,等于或大于指定的对象。如果指定对象的类型阻止将其与该对象进行比较,则抛出ClassCastException

在下面的描述中,符号sgn(expression)指定数学signum函数,该函数根据表达式的值为负,零还是正而定义为返回-1、0或1。

•实施者必须确保所有x和y均为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

•最后,实施者必须确保x.compareTo(y) == 0暗示sgn(x.compareTo(z)) == sgn(y.compareTo(z)),适用于所有z。

•强烈建议(但不是必需)那个(x.compareTo(y) == 0) == (x.equals(y))。一般而言,任何实现Comparable接口且违反此条件的类都应明确表明这一事实。

© www.soinside.com 2019 - 2024. All rights reserved.