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
相关产品推荐
相关产品推荐

