要素の長さに基づいてBashソート配列がありますか?

要素の長さに基づいてBashソート配列がありますか?

文字列配列が与えられたら、各要素の長さに基づいて配列をソートしたいと思います。

たとえば...

    array=(
    "tiny string"
    "the longest string in the list"
    "middle string"
    "medium string"
    "also a medium string"
    "short string"
    )

次のようにソートする必要があります。

    "the longest string in the list"
    "also a medium string"
    "medium string"
    "middle string"
    "short string"
    "tiny string"

medium string(ボーナスとして同じ長さの文字列のリストをアルファベット順に並べると良いでしょう。上記の例では、同じ長さであっても以前に並べ替えることができますが、middle stringこれは「ハード」ではありません。解決策があるかどうかをリクエストしてください.)

配列が所定の位置に配置されている場合(つまり、「配列」が変更された場合)、新しい順序付き配列が作成された場合は問題ありません。

ベストアンサー1

文字列に改行文字が含まれていない場合は、次のようになります。文字列自体を補助ソート基準として使用して、配列のインデックスを長さでソートします。

#!/bin/bash
array=(
    "tiny string"
    "the longest string in the list"
    "middle string"
    "medium string"
    "also a medium string"
    "short string"
)
expected=(
    "the longest string in the list"
    "also a medium string"
    "medium string"
    "middle string"
    "short string"
    "tiny string"
)

indexes=( $(
    for i in "${!array[@]}" ; do
        printf '%s %s %s\n' $i "${#array[i]}" "${array[i]}"
    done | sort -nrk2,2 -rk3 | cut -f1 -d' '
))

for i in "${indexes[@]}" ; do
    sorted+=("${array[i]}")
done

diff <(echo "${expected[@]}") \
     <(echo "${sorted[@]}")

実際のプログラミング言語に移動すると、ソリューションが大幅に簡素化される可能性があります。たとえば、Perlでは次のことができます。

sort { length $b <=> length $a or $a cmp $b } @array

おすすめ記事