如何以产生以下输出的方式对Java中的整数列表进行排序?
输入:[7,8,32,97,27,2]
产出:[97,8,7,32,27,2]
所需的订购:
首先,数字应按其第一个数字的降序排序,然后按其第二个数字的降序排序,依此类推......
答案 0 :(得分:8)
您需要的顺序是字典顺序降序。
字典顺序降序是指如果将输入列表的数字视为字符串并按降序排序,您将获得的顺序。如果所有整数具有相同的数字位数,则字典顺序将与整数的自然排序相同。
但是,如果整数的位数不同,则顺序不同。
例如,[10,9,8,7,6,5,4,3,2,1]
将按字典顺序降序排列为[9,8,7,6,5,4,3,2,10,1]
。
因此我的实施:
int
数组转换为String
数组。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]);
}
}
测试:
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
}