shell数组排序、二分查找

偶尔会在shell中想用类似java map或python 字典的数据结构,没有,做个替代的东东吧。

用两个数组分别保存key、value,根据key排序做个索引的数组,查找key对应的value时通过二分查找获得。

数组保存不用写代码,需要一个创建索引的函数、一个通过索引二分查找的函数:

<pre name="code" class="plain">#create exampe:
#a=(d s a f g)
#index=($(createIndex a))
#echo ${index[@]}    #result is : 2 0 3 4 1
function createIndex()
{
    eval local tmpn=\${#$1[@]}
    local tmpi=0
    local index=($(for((tmpi=0;tmpi<${tmpn};tmpi++))
        do 
        eval echo -e "\${$1[${tmpi}]}\\\\t${tmpi}\\\\n"
        done | sort | awk '{print $2}'))
    echo "${index[@]}"
}

#find exampe:
#i=$(findByIndex a index g)    #i : 4
#echo ${a[${i}]}	#result is : g
#if [[ ${i} =~ -.+ ]]; then echo "not found"; fi
findByIndex()
{
    eval local tmpn=\${#$1[@]}
    local findvalue="$3"
    local findindex=-1
    local mini=0
    local maxi=${tmpn}
    local curi
    local curindex
    local curvalue
    while [[ mini -le maxi ]]
    do
		curi=$(((mini+maxi)/2))
        eval curindex=\${$2[${curi}]}
        eval curvalue=\${$1[${curindex}]}
        if [[ "${findvalue}" > "${curvalue}" ]]; then
            mini=$((${curi}+1))
        elif [[ "${findvalue}" < "${curvalue}" ]]; then
            maxi=$((${curi}-1))
        else
            findindex=${curindex}
            break
        fi
    done
    echo ${findindex}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值