这种集合排序在 Java 中是如何工作的?



我在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对输入进行排序。

以下是调试器步骤:

  1. X = 30, Y = 34 , XY = 3034 , YX = 3430, return 1
  2. X = 9, Y = 30, XY = 930, YX = 309, return -1
  3. X = 9, Y = 30, XY = 930, YX = 309, return -1
  4. X= 9, Y = 34, XY = 934, YX = 349, return -1
  5. X = 5, Y = 34, XY = 534, YX = 345, return -1
  6. X = 9, Y = 5, XY = 59, YX = 95, return 1,
  7. X = 3, Y = 34, XY = 334, YX = 343, return 1,
  8. 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(之前。由于XYYX的长度相同,因此数字XYYX的比较本身可以是字符串比较。这就是什么

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

我们也可以把这个论点扩展到其他观察。

最新更新