如何按第一个数字的降序对整数数组进行排序?

sau*_*war -13 java arrays sorting

如何以一种产生以下输出的方式对Java中的整数列表进行排序?

输入:[7,8,32,97,27,2]

产出:[97,8,7,32,27,2]

所需订购:

首先,数字应按其第一个数字的降序排序,然后按其第二个数字的降序排序,依此类推......

Era*_*ran 8

您需要的顺序是字典顺序降序.

如果您将输入列表的数字视为字符串并按降序排序,则字典顺序降序是您将获得的顺序.如果所有整数具有相同的数字位数,则词典顺序将与整数的自然排序相同.

但是,如果整数具有不同的位数,则顺序不同.

例如,[10,9,8,7,6,5,4,3,2,1]将按[9,8,7,6,5,4,3,2,10,1]字典顺序降序排序.

因此我的实施:

  1. int数组转换为String数组.
  2. 根据Comparable自然排序(对于String,按字典顺序比较两个字符串),使用Arrays.sort()按升序对数组进行排序.
  3. 转换回int数组,反转顺序(降序).

实施:

public static void lexSort (int[] array)
{
  String[] sarr = new String[array.length];
  // convent the array to a String array
  for (int i = 0; i < sarr.length; i++) {
    sarr[i] = Integer.toString (array[i]);
  }
  // sort the String array (descending lexicographical order)
  Arrays.sort (sarr);
  // assign the sorted String array back to the input int array in reverse order
  for (int i = 0; i < sarr.length; i++) {
    array[i] = Integer.parseInt (sarr[sarr.length-1-i]);
  }
}
Run Code Online (Sandbox Code Playgroud)

测试:

int[] input = {7,8,32,97,27,2};
System.out.println ("before: " + Arrays.toString (input));
lexSort(input);
System.out.println ("after: " + Arrays.toString (input));
Run Code Online (Sandbox Code Playgroud)

输出:

before: [7, 8, 32, 97, 27, 2]
after: [97, 8, 7, 32, 27, 2]
Run Code Online (Sandbox Code Playgroud)

使用Java 8 Stream的更优雅的解决方案(请注意,此解决方案返回一个新的排序数组,而不是修改原始数组):

public static int[] lexSort (int[] array)
{
  return IntStream.of (array)
                  .mapToObj (Integer::toString) // convert the integers to Strings
                  .sorted (Comparator.reverseOrder ()) // sort in reversed lexicographical 
                                                       // order
                  .mapToInt (Integer::parseInt) // convert the sorted Strings back to 
                                                // integers
                  .toArray (); // output the sorted stream to an array
}
Run Code Online (Sandbox Code Playgroud)