我在GeeksforGeeks上找到了这段代码。与它无关。我只是想了解以下排序函数如何与以下自定义比较器配合使用。
这是代码片段
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 1
X = 9, Y = 30, XY = 930, YX = 309, return -1
X = 9, Y = 30, XY = 930, YX = 309, return -1
X= 9, Y = 34, XY = 934, YX = 349, return -1
X = 5, Y = 34, XY = 534, YX = 345, return -1
X = 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 解决方案(
这不是从大到小对单个数字进行排序。
但是,这会按顺序对给定列表进行排序,以便在附加最终的数字列表时,将给出可以通过附加输入数字获得的最大可能数字。
为了得到最大数,如果数字(X appended with Y
,即XY = X + Y
(大于数字(Y appended with X
,即YX = Y + X
(,列表中的一个数字(X
(必须出现在列表中另一个数字(Y
(之前。由于XY
和YX
的长度相同,因此数字XY
和YX
的比较本身可以是字符串比较。这就是什么
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;
}
});
达到。
在你的观察中,
X = 30, Y = 34 , XY = 3034 , YX = 3430, return 1 --> this places 34 before 30
因为只要我们修复其他数字,任何可能性 34***30 都将大于30***34。
X = 9, Y = 30, XY = 930, YX = 309, return -1 --> this places 9 before 30
因为只要我们修复其他数字,任何可能性 9***30 都将大于30***9。
我们也可以把这个论点扩展到其他观察。