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

标签 arrays bash optimization

给出这个数组:

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

关于arrays - 删除数组元素的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796075/

相关文章:

c - 内存到内存传输优化,如何不memcpy?

java - 通过覆盖 Arrays.sort() 对对象数组进行排序

arrays - Underscore.js groupBy 多个值

bash - 使用另一个列表中的名称重命名文件列表

linux - 为什么 Linux grep 没有给出正确的换行符计数?

java - 快速乘法和减法取模素数

algorithm - 为成对工作的人安排轮类

C# 返回数组的索引,其中值与任意字符串匹配

c - 在二维矩阵中向右移动部件

bash - 将命令的输出分配给变量