【发布时间】:2020-03-23 18:34:38
【问题描述】:
这里是代码
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 会做同样的事情。那么,实际的区别是什么?谢谢
【问题讨论】:
-
0 表示顺序相等,-1 表示第一个参数在第二个参数之前
-
但是第一个参数不是已经在第二个参数之前了吗?
-
零并不一定“保持原样”顺便说一句。这完全取决于stability of the sort。你很幸运,底层算法是 - 我相信 - timsort,它是稳定的。从技术上讲,这是一个实现细节,可能会在未来的版本中发生变化。
-
不明白你的意思。就像我说的,0 和 -1 之间存在差异,在等于和小于之间。 “-1 在比较时不会改变两个对象的原始顺序” 确实如此。它将第一个参数放在第二个之前。
标签: java compare comparator comparable