【问题标题】:Longest pair of string elements or longest side of the pairs in Bash arrayBash数组中最长的字符串元素对或最长边
【发布时间】:2021-02-24 21:04:46
【问题描述】:

在 Bash 中给定一个数组:

my_array=("a" "b"    "a bc" "d"    "ab" "cd")

将数组中的每两个连续项视为pair,我该怎么做:

  • 获取最长对的长度。在上面的示例中,它将是"a bc" "d",因此长度为5
  • 获取对中最长的第一个项目的长度。上面是"a bc",所以长度是4
  • 获取对中第二项最长的长度。上面是"cd",所以长度是2

【问题讨论】:

    标签: arrays bash shell string-length


    【解决方案1】:

    诀窍是使用for 循环,每次将索引变量递增2。其他一切都是基本的参数扩展,以获取元素的长度并针对当前最大值进行测试。

    #!/usr/bin/env bash
    
    declare -a my_array=("a" "b"    "a bc" "d"    "ab" "cd")
    declare -i maxlen_combo=0 maxlen_first=0 maxlen_second=0
    
    IFS=""
    for (( i = 0; i < ${#my_array[@]}; i += 2 )); do
        if [[ $maxlen_first -lt ${#my_array[i]} ]]; then
            maxlen_first=${#my_array[i]}
        fi
        if [[ $maxlen_second -lt ${#my_array[i+1]} ]]; then
            maxlen_second=${#my_array[i+1]}
        fi
        combo="${my_array[*]:i:2}"
        if [[ $maxlen_combo -lt ${#combo} ]]; then
            maxlen_combo=${#combo}
        fi
    done
    
    echo "Maximum pair length: $maxlen_combo"
    echo "Maximum first length: $maxlen_first"
    echo "Maximum second length: $maxlen_second"
    

    【讨论】:

      【解决方案2】:

      你可以使用

      printf "%s\n" ${my_array[@]} |
      awk '{itemlen=length($0)}
           NR%2==1 {
                    firstmaxlen = (itemlen > firstmaxlen) ? itemlen : firstmaxlen;
                    firsthalf=itemlen
                   }
           NR%2==0 {
                    secondmaxlen = (itemlen > secondmaxlen) ? itemlen : secondmaxlen;
                    pairlen = (firsthalf + itemlen > pairlen ) ? firsthalf + itemlen : pairlen ;
                   }
            END { printf ("maxcombo, maxfirst, maxsecond) = (%d, %d, %d)\n", 
                  pairlen, firstmaxlen, secondmaxlen) }
          '
      

      在这种情况下,一个小函数可以提供帮助:

      printf "%s\n" ${my_array[@]} |
      awk 'function max(a,b) { return (a>b ? a : b) }
           {itemlen=length($0)}
           NR%2==1 {
                    firstmaxlen = max(itemlen, firstmaxlen);
                    firsthalf=itemlen
                   }
           NR%2==0 {
                    secondmaxlen = max(itemlen, secondmaxlen);
                    pairlen = max(firsthalf + itemlen, pairlen);
                   }
            END { printf ("maxcombo, maxfirst, maxsecond) = (%d, %d, %d)\n", 
                         pairlen, firstmaxlen, secondmaxlen) }
          '
      

      【讨论】:

        猜你喜欢
        • 2013-05-25
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        相关资源
        最近更新 更多