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

使用Bubble Sort按姓氏字母排序时,拆分姓名遇问题求助

按姓氏冒泡排序的解决方案

你的代码核心问题是错误地将整个姓名数组转成了字符数组排序,这会把所有姓名拆成单个字符打乱重组,完全达不到按姓氏排序的目的。要实现按姓氏排序,需要针对每个姓名提取姓氏,再基于姓氏做冒泡排序。

修正步骤:

  • 不要把String数组转成char数组,直接对String数组做冒泡排序
  • 对每个姓名,用split(" ")拆分出姓氏(假设姓名格式是「名 姓」,拆分后取索引为1的元素)
  • 在冒泡排序的比较逻辑中,用姓氏的字符串比较替代单个字符比较

修正后的完整代码:

public class Surnames {
    public static void main(String args[]) {
        String names[] = {"Dippy Duck", "Annie Apple", "Bobby Banana", "Charlie Cherry"};
        
        // 调用修正后的冒泡排序,传入String数组
        bubbleSortBySurname(names);
        
        // 遍历输出排序后的姓名
        for (String name : names) {
            System.out.println(name);
        }
    }

    // 针对String数组,按姓氏排序的冒泡排序方法
    public static void bubbleSortBySurname(String[] names) {
        int limit = names.length;
        for (int i = 0; i < limit - 1; i++) {
            for (int j = 0; j < limit - i - 1; j++) {
                // 提取当前元素和下一个元素的姓氏
                String surname1 = names[j].split(" ")[1];
                String surname2 = names[j+1].split(" ")[1];
                
                // 用String的compareTo方法比较姓氏:如果surname1字典序大于surname2,就交换
                if (surname1.compareTo(surname2) > 0) {
                    String temp = names[j];
                    names[j] = names[j+1];
                    names[j+1] = temp;
                }
            }
        }
    }
}

关键说明:

  1. 姓氏提取:split(" ")会把姓名按空格拆分成字符串数组,比如"Dippy Duck"拆成["Dippy", "Duck"],取索引1的元素就是姓氏。如果存在中间名(比如"Mary Ann Smith"),可以改成取数组最后一个元素split(" ")[splitArr.length-1]来兼容。
  2. 字符串比较:String.compareTo()方法会按Unicode码点比较字符串的字典序,正好符合字母排序的需求——返回值大于0表示前者字典序靠后,需要交换位置。
  3. 排序对象:直接对原String数组操作,排序后每个元素还是完整的姓名,输出时自然保持「名 姓」的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:37:02