【发布时间】:2020-06-16 11:31:24
【问题描述】:
我在GeeksforGeeks 上找到了此代码。与它无关。我只是想了解以下排序功能如何与以下自定义比较器一起使用。
这里是代码sn-p
static void printLargest(List<String> arr){
Collections.sort(arr, new Comparator<String>(){
@Override
public int compare(String X, String Y) {
String XY=X + Y;
String YX=Y + X;
return XY.compareTo(YX) > 0 ? -1:1;
}
});
Iterator it = arr.iterator();
while(it.hasNext())
System.out.print(it.next());
}
public static void main(String[] args) throws Exception {
List<String> sample = new ArrayList<>();
sample.add("34");
sample.add("30");
sample.add("9");
sample.add("5");
sample.add("3");
printLargest(sample);
}
如果我没记错的话。爪哇Collection
使用Quick Sort 对输入进行排序。
以下是调试器步骤:
X = 30, Y = 34 , XY = 3034 , YX = 3430, return 1X = 9, Y = 30, XY = 930, YX = 309, return -1X = 9, Y = 30, XY = 930, YX = 309, return -1X= 9, Y = 34, XY = 934, YX = 349, return -1X = 5, Y = 34, XY = 534, YX = 345, return -1X = 9, Y = 5, XY = 59, YX = 95, return 1,X = 3, Y = 34, XY = 334, YX = 343, return 1,X = 3, Y= 30 , XY = 330, YX = 303, return -1
输出是9534330。基本上该列表将自身修改为9, 5, 34, 3, 30。如果我看到这种模式,我无法弄清楚他们是如何在比较器上应用 Quick Sort 的。我需要一些洞察力来理解代码。
任何提示都会很明显。
编辑 1:
如果有人错过了问题的链接。这是有效的解决方案:
https://www.geeksforgeeks.org/given-an-array-of-numbers-arrange-the-numbers-to-form-the-biggest-number/。 (查看java解决方案)
【问题讨论】:
-
这里唯一的区别是“排序函数”是明确定义的,而不是我猜想
.equals比较字符串时的标准函数。基本上new Comparator<String>(){...}是排序功能。您仍然进行快速排序,但与此定义的函数进行比较。 -
9, 5, 34, 3, 30,对我来说,看起来不像是排序的。或者我不明白你的问题。 -
@MohammadZeineldeen 同意,但在检查调试器后我仍然不明白它是如何工作的
-
@KunLun 确切地说,这甚至没有排序,但正如
GeeksForGeeks和其他竞争网站所说,它在应用上述比较器后以某种方式排序 -
集合不使用快速排序。但这无所谓。比较器坏了。当两个元素相等时,比较器必须返回零,而此比较器不会。因此,如果代码具有预期的结果,那只是巧合。无法保证它在不同的运行时环境中会产生相同的结果。甚至不清楚为什么这段代码会做这个不正确的事情,而不仅仅是
return YX.compareTo(XY);
标签: java arraylist collections quicksort