如何验证LinkedList<String>是否按降序排列?
验证LinkedList是否按降序排列的实现方案
当然有办法实现降序验证啦!我看你已经搞定了升序的逻辑,那降序的思路其实是升序的反向,咱们来一步步完善它:
首先,先指出你现有降序代码的两个小问题:
- 没有初始化
previous变量(升序里有初始化,降序这里漏掉了) - 判断条件的逻辑需要调整,降序要求每个后续元素不大于前一个元素
下面是完善后的完整代码:
public static boolean verifyRecords(LinkedList<String> recordList, String order) throws Exception { // 先处理空列表的情况(可选,但更严谨) if (recordList == null || recordList.isEmpty()) { return true; // 或者根据需求返回false,取决于空列表是否视为"有序" } /*To check ascending order*/ if("Ascending".equalsIgnoreCase(order) || "A".equalsIgnoreCase(order)) { String previous = recordList.get(0); // 改用第一个元素初始化,比空字符串更严谨 for(int i = 1; i < recordList.size(); i++) { String current = recordList.get(i); if(current.compareTo(previous) < 0) { return false; } previous = current; } } else if("Descending".equalsIgnoreCase(order) || "D".equalsIgnoreCase(order)) { String previous = recordList.get(0); // 初始化previous为第一个元素 for(int i = 1; i < recordList.size(); i++) { String current = recordList.get(i); // 降序要求current <= previous,所以如果current比previous大,就不符合 if(current.compareTo(previous) > 0) { return false; } previous = current; } } else { // 处理无效的排序参数 throw new Exception("Invalid order parameter. Use 'Ascending'/'A' or 'Descending'/'D'"); } return true; }
关键逻辑解释:
- 初始化
previous:我把原来的空字符串初始化改成了用列表的第一个元素,这样更严谨——毕竟空字符串和任意字符串的比较结果可能不符合你的实际排序预期(比如你可能是要按业务字符串的自然排序,而不是和空串比)。 - 降序判断条件:
String.compareTo()方法返回正数表示当前字符串大于参数,所以降序时如果current.compareTo(previous) > 0,说明当前元素比前一个大,破坏了降序规则,直接返回false。 - 空列表处理:增加了空列表的判断,避免后续循环出错,你可以根据业务需求决定空列表是否返回
true。 - 无效参数处理:增加了对非法排序参数的异常抛出,让方法的鲁棒性更强。
如果你想保持原代码的增强for循环风格,也可以这样写降序部分:
} else if("Descending".equalsIgnoreCase(order) || "D".equalsIgnoreCase(order)) { String previous = null; for(String current : recordList) { if(previous != null) { if(current.compareTo(previous) > 0) { return false; } } previous = current; } }
这种写法不用索引,和你原升序的循环风格一致,第一次循环时previous是null,跳过判断,之后每次用当前元素更新previous即可。
内容的提问来源于stack exchange,提问作者Nandhis
相关产品推荐
相关产品推荐

