如何对存储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
相关产品推荐
相关产品推荐

