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

Java 11中基于自定义列表索引的多级过滤优化方案问询

多级有序集合按索引过滤的优化方案与递归实现思路

一、简化非递归实现

你当前用AtomicInteger在流里做索引匹配完全是绕远路——List本身提供了基于索引直接访问的get()方法,只要先判断索引合法性,就能一步到位拿到目标元素,代码会精简很多:

ParentEntity filterByIndexes(List<ParentEntity> parents, Integer prntIdx, Integer chldIdx) {
    // 原代码索引从1开始,这里转成List的0基索引
    int parentListIdx = prntIdx - 1;
    if (parentListIdx < 0 || parentListIdx >= parents.size()) {
        return null;
    }
    ParentEntity targetParent = parents.get(parentListIdx);
    
    int childListIdx = chldIdx - 1;
    List<ChildEntity> children = targetParent.getChildEntities();
    if (childListIdx < 0 || childListIdx >= children.size()) {
        return null;
    }
    // 若需直接返回ChildEntity,修改返回值即可
    targetParent.setTargetChild(children.get(childListIdx));
    return targetParent;
}

核心是利用List的索引访问特性,避免流里做多余的计数判断,代码逻辑更直观。

二、递归实现(支持任意多级结构)

如果你的集合层级可能不止父-子(比如父-子-孙这类嵌套结构),可以用递归实现通用的索引过滤逻辑。先定义统一接口来规范所有层级的节点:

interface IndexedNode {
    List<? extends IndexedNode> getChildren();
}

// 让ParentEntity和ChildEntity实现该接口
class ParentEntity implements IndexedNode {
    private List<ChildEntity> childEntities;
    
    @Override
    public List<ChildEntity> getChildren() {
        return childEntities;
    }
}

class ChildEntity implements IndexedNode {
    // 若Child还有子节点,实现getChildren即可;无则返回空列表
    @Override
    public List<? extends IndexedNode> getChildren() {
        return Collections.emptyList();
    }
}

然后写递归方法,接收索引路径列表(比如[1,2]表示第1个父节点下的第2个子节点):

IndexedNode filterByIndexPath(List<? extends IndexedNode> rootNodes, List<Integer> indexPath) {
    if (indexPath.isEmpty()) {
        return null;
    }
    // 转换为0基索引并校验合法性
    int currentIdx = indexPath.get(0) - 1;
    if (currentIdx < 0 || currentIdx >= rootNodes.size()) {
        return null;
    }
    IndexedNode currentNode = rootNodes.get(currentIdx);
    // 到达最后一层索引,返回当前节点
    if (indexPath.size() == 1) {
        return currentNode;
    }
    // 递归处理下一层级
    return filterByIndexPath(currentNode.getChildren(), indexPath.subList(1, indexPath.size()));
}

调用示例:

List<Integer> path = Arrays.asList(2, 3);
ChildEntity targetChild = (ChildEntity) filterByIndexPath(parents, path);

三、额外优化点

  • 索引合法性校验必须前置,避免抛出IndexOutOfBoundsException
  • 若GUI场景用0基索引,直接移除-1的转换逻辑即可
  • 递归方法可加入泛型约束,避免强制类型转换,提升代码安全性

内容的提问来源于stack exchange,提问作者Andrzej Więcławski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:35:16