加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 使用非连续索引查找关联数组中的重复元素

发布时间:2020-12-15 22:02:27 所属栏目:安全 来源:网络整理
导读:我一般都是从bash和代码开始编写这个有很多痛苦,任何人都可以告诉我它是否适用于每种情况,也许有人有更好的方法? 提前谢谢了. array=( [0]=24 [1]=24 [5]=10 [6]=24 [10]=24 [12]=12 )KEYS=(${!array[@]})for i in "${!KEYS[@]}"; do for j in "${!KEYS[@]}
我一般都是从bash和代码开始编写这个有很多痛苦,任何人都可以告诉我它是否适用于每种情况,也许有人有更好的方法?
提前谢谢了.

array=( [0]=24 [1]=24 [5]=10 [6]=24 [10]=24 [12]=12 )
KEYS=(${!array[@]})

for i in "${!KEYS[@]}"; do

    for j in "${!KEYS[@]}"; do

    if [[ $i -eq $j ]]; then
        continue
    fi

    if [[ ${array[${KEYS[$i]}]} -eq ${array[${KEYS[$j]}]} ]]; then

        duplicate+=( ${KEYS[$j]} )
    fi
    done

done

uniq=($(printf "%sn" "${duplicate[@]}" | sort -u)); 

echo "${uniq[@]}"

编辑:

我的预期输出是一个包含重复元素索引的数组.

解决方法

这种方法具有线性复杂度(假设恒定时间数组查找)而不是级联循环的二次复杂度:

array=( [0]=24 [1]=24 [5]=10 [6]=24 [10]=24 [12]=12 )
ref=( )

for i in "${!array[@]}"; do
    ref[array[i]]="${ref[array[i]]}$i "
done

for i in "${!ref[@]}"; do
    [[ "${ref[i]% }" == *" "* ]] && echo "$i @ ${ref[i]% }"
done

第一个循环将数据从array []复制到ref [],切换键和值的角色,并在发生冲突时连接新值(各个条目之间有空白).因此,在第一个循环之后,ref []将具有以下内容:

ref=( [10]="5 " [12]="12 " [24]="0 1 6 10 " )

第二个循环打印来自ref []的条目,但跳过所有不包含空白的条目,不计算尾随空白,因此只打印那些指向array []中两个或更多条目的条目.

编辑:使用Adrian在评论中建议的稍微简单的版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读