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

