list.sort() 在排除一个特定值时如何工作?
how list.sort() works when exclude one specific value?
我有一个列表
List<String> names = new ArrayList<String>();
names.add("One");
names.add("Two");
names.add("Three");
names.add("Six");
names.add("Four");
names.add("Five");
我希望此列表排序为第 6 个在前,然后按字母顺序排列。
names.sort((x, y) -> {
if (x.startsWith("S"))
return -1;
if (y.startsWith("S"))
return 1;
return x.compareTo(y);
});
这很好用。为什么它不适用于 x.startswith("S")
条件。为什么我需要为 y.startsWith("S")
添加条件
您不知道 sort
算法将以何种顺序比较您的 String
。它可能会调用 compare("Two","Six")
,也可能会调用 compare("Six","Two")
。因此,您的 Comparator
必须支持这两种情况。
此外,如果不检查第一个和第二个参数的 startsWith("S")
,您将违反 Comparator
合同,该合同要求 sgn(compare(x, y)) == -sgn(compare(y, x))
.
顺便说一句,最好检查 equals("Six")
而不是 startsWith("S")
。否则,如果您的输入包含 "Seven".
,您的代码将失败
collections.sort使用的是归并排序,归并排序的思想是将列表分阶段划分为单个元素列表,然后在这些阶段按顺序合并回来,所以不能保证你的"six" 将是比较中的第一个元素或第二个元素
我有一个列表
List<String> names = new ArrayList<String>();
names.add("One");
names.add("Two");
names.add("Three");
names.add("Six");
names.add("Four");
names.add("Five");
我希望此列表排序为第 6 个在前,然后按字母顺序排列。
names.sort((x, y) -> {
if (x.startsWith("S"))
return -1;
if (y.startsWith("S"))
return 1;
return x.compareTo(y);
});
这很好用。为什么它不适用于 x.startswith("S")
条件。为什么我需要为 y.startsWith("S")
您不知道 sort
算法将以何种顺序比较您的 String
。它可能会调用 compare("Two","Six")
,也可能会调用 compare("Six","Two")
。因此,您的 Comparator
必须支持这两种情况。
此外,如果不检查第一个和第二个参数的 startsWith("S")
,您将违反 Comparator
合同,该合同要求 sgn(compare(x, y)) == -sgn(compare(y, x))
.
顺便说一句,最好检查 equals("Six")
而不是 startsWith("S")
。否则,如果您的输入包含 "Seven".
collections.sort使用的是归并排序,归并排序的思想是将列表分阶段划分为单个元素列表,然后在这些阶段按顺序合并回来,所以不能保证你的"six" 将是比较中的第一个元素或第二个元素