这里是代码
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会执行相同的操作。那么,实际区别是什么?谢谢
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接口且违反此条件的类都应明确表明这一事实。