如何让DOM4J的DocumentHelper按整数属性对节点列表排序?
按整数属性排序XML节点的解决方案
你当前用DocumentHelper.sort(pointList, "@Index")是默认按字符串规则排序,会出现"10"排在"2"前面的字母数字排序问题。要实现按整数排序,需要自定义Comparator解析@Index属性的整数值来比较,替换默认排序逻辑。
修改后的代码如下:
private void sortNodesByIndex(Element parent, List<Node> pointList) { // 自定义Comparator,按@Index属性的整数值排序 pointList.sort((node1, node2) -> { // 获取两个节点的@Index属性字符串值 String indexStr1 = node1.valueOf("@Index"); String indexStr2 = node2.valueOf("@Index"); // 转换为整数后比较大小 Integer index1 = Integer.parseInt(indexStr1); Integer index2 = Integer.parseInt(indexStr2); return index1.compareTo(index2); }); for (Node node : pointList) { parent.remove(node); parent.add(node); } }
关键说明:
- 用
List.sort()配合自定义Comparator替代DocumentHelper.sort的默认字符串排序 - 通过
node.valueOf("@Index")读取属性值,再用Integer.parseInt转为整数 - 借助
Integer.compareTo()实现整数的自然排序
如果需要处理@Index属性缺失或非整数的异常情况,可以补充判断逻辑:
private void sortNodesByIndex(Element parent, List<Node> pointList) { pointList.sort((node1, node2) -> { Integer index1 = getValidIndex(node1); Integer index2 = getValidIndex(node2); return index1.compareTo(index2); }); for (Node node : pointList) { parent.remove(node); parent.add(node); } } private Integer getValidIndex(Node node) { String indexStr = node.valueOf("@Index"); if (indexStr == null || indexStr.isEmpty()) { // 给缺失属性的节点设置默认值,可按需调整 return 0; } try { return Integer.parseInt(indexStr); } catch (NumberFormatException e) { // 处理非整数属性的情况,默认值可自定义 return 0; } }
内容的提问来源于stack exchange,提问作者Paul Kennedy
相关产品推荐
相关产品推荐

