【问题标题】:How does this collection sorting works in java?这个集合排序在java中是如何工作的?
【发布时间】: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 对输入进行排序。

以下是调试器步骤:

  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解决方案)

【问题讨论】:

  • 这里唯一的区别是“排序函数”是明确定义的,而不是我猜想.equals比较字符串时的标准函数。基本上new Comparator&lt;String&gt;(){...} 是排序功能。您仍然进行快速排序,但与此定义的函数进行比较。
  • 9, 5, 34, 3, 30,对我来说,看起来不像是排序的。或者我不明白你的问题。
  • @MohammadZeineldeen 同意,但在检查调试器后我仍然不明白它是如何工作的
  • @KunLun 确切地说,这甚至没有排序,但正如GeeksForGeeks 和其他竞争网站所说,它在应用上述比较器后以某种方式排序
  • 集合不使用快速排序。但这无所谓。比较器坏了。当两个元素相等时,比较器必须返回零,而此比较器不会。因此,如果代码具有预期的结果,那只是巧合。无法保证它在不同的运行时环境中会产生相同的结果。甚至不清楚为什么这段代码会做这个不正确的事情,而不仅仅是return YX.compareTo(XY);

标签: java arraylist collections quicksort


【解决方案1】:

这不是将单个数字从大到小排序。

但是,这会按顺序对给定列表进行排序,以便在附加最终数字列表时,将给出通过附加输入数字可以得到的最大可能数字。

要获得最大数字,列表中的数字(X)必须出现在列表中的另一个数字(Y)之前,如果数字(X appended with Y,即XY = X + Y)大于数字(Y appended with X,即YX = Y + X)。由于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

我们也可以将此论点扩展到其他观察结果。

【讨论】:

  • 知道了。谢谢,它给出了一些关于它是如何工作的想法。一件事为什么没有将"3""5""9"进行比较。 (调试器中的第 7 点和第 8 点)?我知道 5&gt;9&gt;34&gt;30 由于比较器 logi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2018-01-18
  • 2010-11-06
  • 2019-05-28
相关资源
最近更新 更多