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
解決方案)。如果數組是就地排序(即“數組”被修改)或創建一個新的排序數組是可以的。
如果字元串不包含換行符,則以下內容應該有效。它使用字元串本身作為輔助排序標準,按長度對數組的索引進行排序。
#!/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