如何将Java中int数组的归并排序代码适配为String数组排序?
没问题,我帮你把这段针对int数组的归并排序代码改成支持String数组按字典序排序的版本。咱们主要需要调整三个核心部分:数组类型替换、比较逻辑修改,以及生成测试数据的工具方法。下面是修改后的完整代码:
修改后的MergeSortDemo类
这个类负责测试排序逻辑,我们可以直接用你给出的示例数组,或者用随机生成的String数组测试:
import java.util.Arrays; public class MergeSortDemo { public static void main(String[] args) { // 用你提供的示例数组测试 String[] a = {"peas", "zucchini", "apple", "berries"}; System.out.println("排序前: " + Arrays.toString(a)); MergeSorter sorter = new MergeSorter(a); sorter.sort(); System.out.println("排序后: " + Arrays.toString(a)); // 也可以用随机生成的String数组测试 // String[] randomArr = ArrayUtil.randomStringArray(5); // System.out.println("随机数组排序前: " + Arrays.toString(randomArr)); // MergeSorter randomSorter = new MergeSorter(randomArr); // randomSorter.sort(); // System.out.println("随机数组排序后: " + Arrays.toString(randomArr)); } }
修改后的ArrayUtil类
把原来生成int数组的方法改成生成随机String数组的方法,这里我用了一个预设单词库来随机选取,你也可以改成生成随机字符组合的逻辑:
import java.util.Random; public class ArrayUtil { private static Random generator = new Random(); // 预设一些单词用于随机生成测试数组 private static String[] wordPool = {"apple", "berries", "peas", "zucchini", "orange", "banana", "grape", "mango"}; public static String[] randomStringArray(int length) { String[] a = new String[length]; for (int i = 0; i < a.length; i++) { // 从单词库中随机选一个单词 a[i] = wordPool[generator.nextInt(wordPool.length)]; } return a; } }
修改后的MergeSorter类
这是核心的排序类,主要修改了数组类型和比较逻辑:
public class MergeSorter { private String[] a; public MergeSorter(String[] anArray) { a = anArray; } public void sort() { if (a.length <= 1) return; // 拆分数组为两个子数组,类型从int[]改为String[] String[] first = new String[a.length / 2]; String[] second = new String[a.length - first.length]; // 复制元素到子数组 for (int i = 0; i < first.length; i++) { first[i] = a[i]; } for (int i = 0; i < second.length; i++) { second[i] = a[first.length + i]; } // 递归排序子数组 MergeSorter firstSorter = new MergeSorter(first); MergeSorter secondSorter = new MergeSorter(second); firstSorter.sort(); secondSorter.sort(); // 合并两个有序子数组 merge(first, second); } private void merge(String[] first, String[] second) { int iFirst = 0; int iSecond = 0; int j = 0; // 关键修改:用String的compareTo()方法做字典序比较 // compareTo返回负数表示first[iFirst]字典序更小,应该放在前面 while (iFirst < first.length && iSecond < second.length) { if (first[iFirst].compareTo(second[iSecond]) < 0) { a[j] = first[iFirst]; iFirst++; } else { a[j] = second[iSecond]; iSecond++; } j++; } // 处理剩余元素 while (iFirst < first.length) { a[j] = first[iFirst]; iFirst++; j++; } while (iSecond < second.length) { a[j] = second[iSecond]; iSecond++; j++; } } }
关键修改点说明:
- 类型替换:所有涉及
int[]的地方都替换成了String[],包括成员变量、方法参数、子数组定义。 - 比较逻辑:把原来的数值比较
first[iFirst] < second[iSecond]改成了first[iFirst].compareTo(second[iSecond]) < 0。String.compareTo()方法会按照Unicode值(对应常规字典序)比较两个字符串,完全符合你的需求。 - 测试数据:MergeSortDemo里默认用了你给的示例数组,运行后会输出
排序前: [peas, zucchini, apple, berries]和排序后: [apple, berries, peas, zucchini],和你预期的结果一致。
内容的提问来源于stack exchange,提问作者Annabeth2323
相关产品推荐
相关产品推荐

