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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:05:58