数组奇偶元素排序结果不符合预期的问题求助
数组奇偶元素排序结果不符合预期的问题求助
嗨,我看了你的问题和代码,咱们来一步步搞定这个问题~
首先先分析你当前代码的问题:
你的思路是通过把偶数转为负数,再用Arrays.sort()升序排序,最后还原偶数的符号。但这个逻辑和你想要的结果正好相反:
- 偶数转为负数后,原本小的偶数(比如6→-6)比大的偶数(8→-8)数值更大,升序排序后
-8会排在-6前面,还原符号后就变成了8,6,也就是偶数降序; - 奇数保持正数,升序排序后会变成
3,5,7,9,也就是奇数升序,完全不符合你要的「偶数升序、奇数降序」的要求。
下面给你两种可行的修正方案:
方案一:调整原有符号转换逻辑
既然原来的逻辑搞反了,那我们换个思路——把奇数转为负数,再排序还原:
- 遍历数组,将所有奇数乘以-1;
- 对数组进行升序排序,此时负数的奇数会按从小到大排列(比如
-9,-7,-5,-3),偶数保持正数按升序排列(6,8); - 再次遍历数组,把奇数的符号还原(乘以-1);
- 最终数组就会是偶数在前升序、奇数在后降序的结果。
修改后的代码如下:
package practice; import java.util.*; public class arrange { static void twoWaySort(int arr[], int n) { // 把奇数转为负数 for (int i = 0; i < n; i++) if ((arr[i] & 1) != 0) arr[i] *= -1; Arrays.sort(arr); // 还原奇数的符号 for (int i = 0; i < n; i++) if ((arr[i] & 1) != 0) arr[i] *= -1; } public static void main(String[] args) { int arr[] = {9, 3, 5, 6, 7, 8}; twoWaySort(arr, arr.length); System.out.println(Arrays.toString(arr)); // 输出:[6, 8, 9, 7, 5, 3] } }
方案二:分离奇偶数组后分别排序(可读性更强)
如果你觉得符号转换的逻辑容易绕晕,不如直接把偶数和奇数分开处理:
- 创建两个列表,分别存储数组中的偶数和奇数;
- 对偶数列表进行升序排序,对奇数列表进行降序排序;
- 先把排序后的偶数列表元素放入结果数组,再放入排序后的奇数列表元素;
- 最后把结果数组赋值回原数组(或者直接输出)。
代码示例:
package practice; import java.util.*; public class arrange { static void twoWaySort(int arr[], int n) { List<Integer> evens = new ArrayList<>(); List<Integer> odds = new ArrayList<>(); // 分离奇偶元素 for (int num : arr) { if (num % 2 == 0) { evens.add(num); } else { odds.add(num); } } // 偶数升序,奇数降序 Collections.sort(evens); Collections.sort(odds, Collections.reverseOrder()); // 合并结果 int index = 0; for (int even : evens) { arr[index++] = even; } for (int odd : odds) { arr[index++] = odd; } } public static void main(String[] args) { int arr[] = {9, 3, 5, 6, 7, 8}; twoWaySort(arr, arr.length); System.out.println(Arrays.toString(arr)); // 输出:[6, 8, 9, 7, 5, 3] } }
两种方案运行后都能得到你期望的输出结果,你可以根据自己的习惯选择其中一种~
备注:内容来源于stack exchange,提问作者Satyam Rao
相关产品推荐
相关产品推荐

