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

Java如何实现奇偶混合数组中奇数升序排序且偶数位置不变

问题说明

需求为:对输入数组中的奇数做升序排列,数组中偶数的取值、所在位置均不做改动。例如输入数组[1, 5, 2, 7, 3]时,正确输出为[1, 3, 2, 5, 7]。

原代码的错误点
  • Stream排序操作未生效:odds.stream().sorted()不会修改原odds列表,该方法会返回排序后的新流,代码中没有接收这个返回结果,原列表始终是未排序状态。
  • 奇数替换逻辑错误:嵌套循环的写法会让每个奇数位置的元素被反复覆盖为odds列表的最后一个值,无法按顺序填充排序后的奇数。
正确实现代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArraySort {
    public static void main(String[] args) {
        int[] res = sortArray(new int[]{1, 5, 2, 7, 3});
        for (int num : res) {
            System.out.print(num + " ");
        }
    }

    public static int[] sortArray(int[] array) {
        List<Integer> odds = new ArrayList<>();
        // 收集所有奇数
        for (int element : array) {
            if (element % 2 != 0) {
                odds.add(element);
            }
        }
        // 对奇数列表做升序排序
        Collections.sort(odds);
        // 遍历原数组,按顺序替换奇数位置的值
        int oddCursor = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 != 0) {
                array[i] = odds.get(oddCursor);
                oddCursor++;
            }
        }
        return array;
    }
}

代码执行后输出结果为1 3 2 5 7,符合预期。如果偏好Stream写法,收集排序奇数的步骤也可以替换为:

List<Integer> odds = java.util.Arrays.stream(array)
        .filter(num -> num % 2 != 0)
        .sorted()
        .boxed()
        .toList();

后续替换逻辑保持一致即可。

内容的提问来源于stack exchange,提问作者Noah Solomon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:03:21