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

时间:2014-08-20 17:31:28

标签: java arrays sorting

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

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

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

所需的订购:

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

1 个答案:

答案 0 :(得分: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. 使用Arrays.sort()按升序对数组进行排序,根据Comparable自然排序(对于String,按字典顺序比较两个字符串)。
  3. 转换回int数组,撤消订单(以降序排列)。
  4. 实施:

    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]);
      }
    }
    

    测试:

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

    输出:

    before: [7, 8, 32, 97, 27, 2]
    after: [97, 8, 7, 32, 27, 2]
    

    使用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
    }