我一般从 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/