Bash 数组中最长的字符串元素对或对的最长边

Longest pair of string elements or longest side of the pairs in Bash array

给定数组 Bash:

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

将数组中的每两个连续项视为一个 pair,我如何:

诀窍是使用 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"

您可以使用

printf "%s\n" ${my_array[@]} |
awk '{itemlen=length([=10=])}
     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([=11=])}
     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) }
    '