bash - 在具有非连续索引的关联数组中查找重复元素

标签 bash associative-array

我一般从 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 "%s\n" "${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 在评论中建议的稍微简单的版本。

关于bash - 在具有非连续索引的关联数组中查找重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22533354/

相关文章:

bash - 解析前缀为 "Product Name:"的特定字符串的文本文件

arrays - 检查变量是否以 bash 中的另一个变量开头

javascript - 检查关联数组中是否存在键

c# - 如何在 C# 中创建与键 (userID) 配对的固定长度字符串数组(聊天消息)

php - 如何修剪数组中每个键的最后两个字符?

php - AvantFAX 修复 bash 脚本错误

linux - 改变鞭尾鱼的颜色

regex - 如何在shell中拆分字符串

javascript - 添加到列表而不重复出版物

javascript - 如果键不存在,如何在关联的 JavaScript 数组中获取最近的键索引?