Map中环路检测

本文介绍了一种检测Map中键值对环路的方法,并通过递归实现。该方法防止因键值对互换产生的无限循环,确保程序稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map是一种键值对的集合,因为键值在使用时很有可能呼互换,比方说键K1对应的值时V1,然而V1又能作为键,而之前的K1将会作为K1对应的值,就产生了环路了,在很多情况下。产生环路可能会使程序无休止的执行下去造成严重后果,因此需要检测环路产生,当新插入的键值对会使原先的Map产生环路,就拒绝这次插入

环路检测有很多种做法,我最喜欢的一种是:

当存在环路时必然是有(K1,V1)存在且(V1,K1)存在,

因此:

protected void checkForAliasCircle(String name, String alias) {
        if (this.hasAlias(alias, name)) {
            throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" + name + "': Circular reference - '" + name + "' is a direct or indirect alias for '" + alias + "' already");
        }
    }

因此接下来就是分析方法如何找到(K1,V1)存在

public boolean hasAlias(String name, String alias) {
    Iterator var3 = this.aliasMap.entrySet().iterator();

    Entry entry;
    String registeredName;
    do {
        if (!var3.hasNext()) {
            return false;
        }

        entry = (Entry)var3.next();
        registeredName = (String)entry.getValue();
    } while(!registeredName.equals(name));

    String registeredAlias = (String)entry.getKey();
    return registeredAlias.equals(alias) || this.hasAlias(registeredAlias, alias);
}

使用递归解决,代码逻辑清晰,且可高度复用

代码出自spring,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值