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

如何对存储Book对象的自定义循环链表按name字段排序(无法使用Collections.sort)

解决方案

Java 中String类型不能直接用>、<运算符比较大小,需要使用String自带的compareTo()方法实现字典序对比,判断条件写法如下:

基础版(不考虑null值场景)

如果Book类的name字段是同包可访问的,直接替换if(???)为:

if (current.data.name.compareTo(index.data.name) > 0)

如果name是private修饰,先给Book类补充getName() getter方法:

class Book{
    int price;
    private String name;
    public String getName() {
        return name;
    }
}

判断条件改为:

if (current.data.getName().compareTo(index.data.getName()) > 0)

compareTo()返回值规则:

  • 大于0:调用方字符串字典序大于参数字符串
  • 等于0:二者字典序完全相同
  • 小于0:调用方字符串字典序小于参数字符串

兼容null值版

如果存在Book对象的name为null的场景,避免空指针异常可以写为:

String currentName = current.data.name;
String indexName = index.data.name;
// 规则:null值排在最前面
if ((currentName == null && indexName != null)) {
    // 无需交换
} else if (currentName != null && indexName == null) {
    // index的name为null,要换到前面
    temp = current.data;
    current.data = index.data;
    index.data = temp;
} else if (currentName != null && indexName != null && currentName.compareTo(indexName) > 0) {
    // 字典序更大,交换
    temp = current.data;
    current.data = index.data;
    index.data = temp;
}

修正后完整方法示例

public void sortList() {
    Node current = head, index = null;
    Book temp;
    if (head == null) {
        System.out.println("List is empty");
        return;
    }
    do {
        index = current.next;
        while (index != head) {
            // 按name升序排序判断
            if (current.data.name.compareTo(index.data.name) > 0) {
                temp = current.data;
                current.data = index.data;
                index.data = temp;
            }
            index = index.next;
        }
        current = current.next;
    } while (current.next != head);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:39:02