java - 需要帮助理解使用 Arrays.sort() 的算法

标签 java string comparator compareto

问题

给定一个非负整数列表,将它们排列成最大的数。

例如输入:[3,30,34,5,9] 输出:“9534330”

解决方案

public class Solution {
    // DO NOT MODIFY THE LIST
    public String largestNumber(final List<Integer> a) {

    String[] arr = new String[a.size()];
    for (int i = 0; i < a.size(); i++) {
        arr[i] = String.valueOf(a.get(i));
    }


    Arrays.sort(arr, new Comparator<String>(){
        public int compare(String a, String b){
            return (b+a).compareTo(a+b);
        }
    });


    StringBuilder sb = new StringBuilder();
    for(String s: arr){
        sb.append(s);
    }

    if(sb.charAt(0) == '0'){     //check if all zeroes are there
        return String.valueOf(0);
    }

    return sb.toString();   
    }
}

这可行,但我不知道 - 我不明白 Comparator 的作用,但我知道通过交换 (b+a) >(a+b) 在代码中我们将得到一个升序结果 - 但我无法理解它在内部是如何工作的。

最佳答案

你可以在b+a之前写a+b。但随后您必须将 compare 方法的参数切换为 b,然后是 a。但这就是这一切的原因。

首先,您需要假装字符串可以像整数一样使用<和>进行比较。

在排序方法中的某个位置,您有一个比较两个值 rs 的构造。

当你对它们进行排序时,你会得到这样的语句

    if (r < s) {
       swap them
    }

按一个方向对它们进行排序(可能是升序)。

如果你这样做

    if (s < r) {
      swap them 
    }

将它们按另一个方向排序。

当你颠倒rs的顺序时,这就是你正在做的事情。更改排序方向。

将它们连接在一起时,会形成两个不同的字符串 a+bb+a。但过程仍然是一样的,你先从一个方向比较它们,然后再从另一个方向比较。所以本质上是,

    r = a+b
    s = b+a

然后按照上面的方法比较 rs 以获得连接字符串的升序或降序。

这是一个简单的排序方法和两个用于对整数进行排序的比较器,以便您可以了解它们是如何工作的。唯一的区别在于哪个比较返回 -1 与 1。

      int[] v = { 10, 8, 2, 3, 4, 1, 7, 5, 6, 9
      };

      sort(v, new Comparator<Integer>() {
         public int compare(Integer r, Integer s) {
            if (r < s) {
               return -1;
            }
            if (r > s) {
               return 1;
            }
            return 0;
         }
      });

      System.out.println(Arrays.toString(v));

      v = new int[] { 10, 8, 2, 3, 4, 1, 7, 5, 6, 9
      };

      sort(v, new Comparator<Integer>() {
         public int compare(Integer r, Integer s) {
            if (s < r) {
               return -1;
            }
            if (s > r) {
               return 1;
            }
            return 0;
         }
      });

      System.out.println(Arrays.toString(v));
   }

   public static void sort(int[] v, Comparator<Integer> comp) {
      for (int i = 0; i < v.length - 1; i++) {
         for (int k = i + 1; k < v.length; k++) {
            if (comp.compare(v[k], v[i]) < 0) {
               int t = v[i];
               v[i] = v[k];
               v[k] = t;
            }
         }
      }
   }
}

关于java - 需要帮助理解使用 Arrays.sort() 的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58019024/

相关文章:

java - 打印字符串?

java - Android 在网络不可用时将 http 请求排队并在打开时处理它们

java - 如何在 JSP/JSTL 中对 URL 进行 URL 编码?

java - 我可以在 Java 桌面应用程序中执行此操作吗?

string - 用groovy格式化字符串

c - C 语言的翻译限制

Java 树形图 : Different object after "put"?

lambda - 哪个更快?使用自定义比较器类或 lambda 函数

Java:为什么以下构造不抛出 ConcurrentModificationException?

java - 为什么当 Comparator.compare 相等时我们需要返回 0