自定义有序LinkedList从文件读取数据后,toString方法去重失效问题
问题分析与解决方案
核心原因推测
你遇到的问题大概率是文件读取时引入了隐形字符,导致看似相同的"a"/"b"/"c"实际并不相等,使得toString方法的去重逻辑失效。而直接调用insertInOrder插入的是纯字符串,没有额外字符,所以去重正常。
比如从文件读取的"a"可能带有换行符("a\n")或回车符("a\r"),长度是2,而手动插入的"a"长度是1,两者用equals()比较会返回false,toString里的去重逻辑就会认为是不同数据,从而全部输出。
排查与解决步骤
验证读取数据的真实性
在读取文件插入链表前,打印每个读入数据的具体内容和长度,确认是否有隐形字符:String data = ...; // 从文件读取的内容 System.out.println("读取到的数据: '" + data + "',长度: " + data.length());如果输出显示长度大于1(比如"a"的长度是2),说明存在换行/回车符。
清洗读取的数据
对读取到的字符串做清洗,去除多余的空白字符:// 方法1:去除首尾所有空白(包括换行、回车、空格) data = data.trim(); // 方法2:精准去除换行/回车符 data = data.replaceAll("[\\r\\n]", "");清洗后再调用
insertInOrder(data)插入链表。检查toString方法的逻辑正确性
确保你的去重逻辑是针对连续重复的节点,比如正确的实现应该是:@Override public String toString() { if (head == null) return ""; StringBuilder result = new StringBuilder(); ListNode current = head; // 先添加第一个节点的数据 result.append(current.data).append("\n"); while (current.next != null) { // 仅当前一个节点数据与下一个不同时,才追加 if (!current.data.equals(current.next.data)) { result.append(current.next.data).append("\n"); } current = current.next; } // 去除最后多余的换行 return result.toString().trim(); }避免错误的遍历逻辑(比如固定current不动,用checker遍历所有后续节点,这种逻辑如果遇到非连续重复会失效,但你这里是连续重复,所以主要还是数据本身的问题)。
确认插入方法的正确性
确保从文件读取数据时,调用的是insertInOrder方法而非普通的添加方法,保证链表中重复数据是连续排列的——如果重复数据不连续,去重逻辑也会失效(不过你提到排序后是连续的,这一步可以快速确认)。
内容的提问来源于stack exchange,提问作者Blueyu
相关产品推荐
相关产品推荐

