You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组奇偶元素排序结果不符合预期的问题求助

数组奇偶元素排序结果不符合预期的问题求助

嗨,我看了你的问题和代码,咱们来一步步搞定这个问题~

首先先分析你当前代码的问题:
你的思路是通过把偶数转为负数,再用Arrays.sort()升序排序,最后还原偶数的符号。但这个逻辑和你想要的结果正好相反:

  • 偶数转为负数后,原本小的偶数(比如6→-6)比大的偶数(8→-8)数值更大,升序排序后-8会排在-6前面,还原符号后就变成了8,6,也就是偶数降序;
  • 奇数保持正数,升序排序后会变成3,5,7,9,也就是奇数升序,完全不符合你要的「偶数升序、奇数降序」的要求。

下面给你两种可行的修正方案:

方案一:调整原有符号转换逻辑

既然原来的逻辑搞反了,那我们换个思路——把奇数转为负数,再排序还原:

  1. 遍历数组,将所有奇数乘以-1;
  2. 对数组进行升序排序,此时负数的奇数会按从小到大排列(比如-9,-7,-5,-3),偶数保持正数按升序排列(6,8);
  3. 再次遍历数组,把奇数的符号还原(乘以-1);
  4. 最终数组就会是偶数在前升序、奇数在后降序的结果。

修改后的代码如下:

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

方案二:分离奇偶数组后分别排序(可读性更强)

如果你觉得符号转换的逻辑容易绕晕,不如直接把偶数和奇数分开处理:

  1. 创建两个列表,分别存储数组中的偶数和奇数;
  2. 对偶数列表进行升序排序,对奇数列表进行降序排序;
  3. 先把排序后的偶数列表元素放入结果数组,再放入排序后的奇数列表元素;
  4. 最后把结果数组赋值回原数组(或者直接输出)。

代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:09:35