繁体   English   中英

删除数组元素的最快方法是什么?

[英]What is the fastest way to delete an element of an array?

给这个数组:

arr=(hello asd asd1 asd22 asd333)

我想删除一个特定项目的值,例如asd 我这样做了:

IFS=' '
echo "${arr[@]/asd/}"

但它返回以下内容:

你好1 22 333

所以我做了这个功能:

function remove_item() {
    local item_search="$1"
    shift
    local arr_tmp=("${@}")

    if [ ${#arr_tmp[@]} -eq 0 ]; then
        return
    fi

    local index=0
    for item in ${arr_tmp[@]}; do
        if [ "$item" = "$item_search" ]; then
            unset arr_tmp[$index]
            break
        fi
        let index++
    done

    echo "${arr_tmp[*]}"
}

arr=(asd asd1 asd22 asd333)

remove_item 'asd' "${arr[@]}"

打印所需的输出:

hello asd1 asd22 asd333

但我必须使用非常长的数组,我必须多次调用它。 它的表现很糟糕。

你有更好的选择吗? 任何提示,技巧或建议都会受到重视。

您可以使用循环迭代数组并删除与指定值匹配的元素:

for i in "${!arr[@]}"; do
  [[ "${arr[i]}" == "asd" ]] && unset arr[i]
done

如果你知道数组最多只有一个匹配元素,你甚至可以break循环:

  [[ "${arr[i]}" == "asd" ]] && unset arr[i] && break
                                            |^^^^^^^^|
                                             (this causes the loop to break
                                              as soon as the element is found)

举个例子:

$ arr=(asd asd1 asd22 asd333)
$ for i in "${!arr[@]}"; do [[ "${arr[i]}" == "asd" ]] && unset arr[i]; done
$ echo "${arr[@]}"
asd1 asd22 asd333

可能@ devnull的回答最快。 但是不使用循环可能会更快,而是让grep完成工作。 它不是很漂亮:

$ arr=(hello asd asd1 asd22 asd333)
$ remove="asd"
$ i=$(paste -d: <(printf "%s\n" "${!arr[@]}") <(printf "%s\n" "${arr[@]}") | grep -m1 -w -E "^[[:digit:]]+:${remove}$")
$ unset arr[${i%:*}]
$ 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM