从另一个数组创建一个新数组。需要按照另一个数组的元素顺序对新的进行排序

时间:2016-02-07 11:56:08

标签: arrays bash sorting

所以我现在很困惑,因为我是bash的新手,我不确定如何解决这个问题。

#!/bin/bash
declare -a cards=(null SA HA DA CA SK HK DK CK SQ HQ DQ CQ SJ HJ DJ CJ ST HT DT CT S9 H9 D9 C9 S8 H8 D8 C8 S7 H7 D7 C7 S6 H6 D6 C6 S5 H5 D5 C5 S4 H4 D4 C4 S3 H3 D3 C3 S2 H2 D2 C2)
declare -a cardsNamed

for i in "$@"
do

cardsNamed+=' '${cards[i]}

done

echo The hand is $cardsNamed

我需要$ cardsNamed数组按照第一个数组元素的顺序对卡片进行排序。例如,如果cardsNamed有SJ HA DK。它会分类为HA DK SJ。

对于某些背景。这是一款纸牌游戏,通过解析参数显示您选择的牌,然后排序和丢弃对。

真的很感激我能得到的所有帮助。感谢

1 个答案:

答案 0 :(得分:0)

假设你的参数是数组和数组的有效索引,我可以想到两种方法:

对参数进行排序

#!/bin/bash
declare -a cards=(null SA HA DA CA SK HK DK CK SQ HQ DQ CQ SJ HJ DJ CJ ST HT DT CT S9 H9 D9 C9 S8 H8 D8 C8 S7 H7 D7 C7 S6 H6 D6 C6 S5 H5 D5 C5 S4 H4 D4 C4 S3 H3 D3 C3 S2 H2 D2 C2)

for i
do
    cardsNamed+=' '${cards[i]}
done

set -- $(printf "%d\n" "$@" | sort -n)
for i
do
    cardsNamedSorted+=' '${cards[i]}
done

echo The hand is $cardsNamed
echo The sorted hand is $cardsNamedSorted

如果您不想覆盖参数,也可以for i in $(printf "%d\n" "$@" | sort -n)而不是使用set

仅包含所选条目的新数组

#!/bin/bash
declare -a cards=(null SA HA DA CA SK HK DK CK SQ HQ DQ CQ SJ HJ DJ CJ ST HT      DT CT S9 H9 D9 C9 S8 H8 D8 C8 S7 H7 D7 C7 S6 H6 D6 C6 S5 H5 D5 C5 S4 H4 D4 C4 S3 H3 D3 C3 S2 H2 D2 C2)
declare -a cardsNamedSorted

for i
do
    cardsNamed+=' '${cards[i]}
    cardsNamedSorted[i]=${cards[i]}
done

echo The hand is $cardsNamed
echo Sorted hand: "${cardsNamedSorted[@]}"

cardsNamedSorted只会包含指定的条目,其顺序与cards相同。

注意:

    没有for i
  • in <something>for i in "$@"相同。
  • 您已将cardsNamed声明为数组,但其用法类似于普通变量。