首頁  >  文章  >  後端開發  >  javascript - 奧運的獎牌,如何實現以金銀銅多少順序決定國家排位(詳見題目)

javascript - 奧運的獎牌,如何實現以金銀銅多少順序決定國家排位(詳見題目)

WBOY
WBOY原創
2016-10-10 11:56:102215瀏覽

資料的結構大概是這樣

<code> $arr = [
          ['name'=>'国家一','score'=>[10,7,5]],
          ['name'=>'国家二','score'=>[10,9,5]],
          ['name'=>'国家三','score'=>[11,7,5]],
          ['name'=>'国家四','score'=>[10,7,9]],
        ];
</code>

排序的規則是,先比金牌,金牌一致比銀牌,銀牌一致比銅牌,銅牌一致比id,id就是初始的數組序號

score中的三個數字分別代表金,銀,銅的數量

要求較少的用到內建函數,最好用php實作

回覆內容:

資料的結構大概是這樣

<code> $arr = [
          ['name'=>'国家一','score'=>[10,7,5]],
          ['name'=>'国家二','score'=>[10,9,5]],
          ['name'=>'国家三','score'=>[11,7,5]],
          ['name'=>'国家四','score'=>[10,7,9]],
        ];
</code>

排序的規則是,先比金牌,金牌一致比銀牌,銀牌一致比銅牌,銅牌一致比id,id就是初始的數組序號

score中的三個數字分別代表金,銀,銅的數量

要求較少的用到內建函數,最好用php實作

代表獎牌數量的有三個數字,你至少說說排序的規則是什麼樣子的吧

是總的獎牌數量?分別按照金銀銅?還是什麼奇怪的排列組合?


辦法挺多的,比較懶的辦法就是直接比四次,先按照金牌排序,選出金牌一樣的,再在相同的里面按照銀牌排序……以此類推就行了

想要一次性就排序好的話,那就把金銀銅序號,變成一個數字來排序就行了。
比如,你的這個陣列可以變成這樣--

<code>[010007005001,010009005002,011007005003,010007009004]</code>

規則很簡單,金銀銅序號填充至三位,然後直接拼接起來,最後直接對這組數字進行排序就行了,一次到位。

PHP array_multisort實現像SQL ORDER BY那樣按多個字段排序.
比如奧運獎牌榜,依次按金牌,銀牌,銅牌的數目進行降序排序.

<code><?php
header('Content-Type: text/plain; charset=utf-8');
$arr = array(
    '中国' => array(
        '金牌' => 8,
        '银牌' => 3,
        '铜牌' => 6,
    ),
    '俄罗斯' => array(
        '金牌' => 3,
        '银牌' => 6,
        '铜牌' => 3,
    ),
    '美国' => array(
        '金牌' => 6,
        '银牌' => 8,
        '铜牌' => 8,
    ),
    '澳大利亚' => array(
        '金牌' => 4,
        '银牌' => 0,
        '铜牌' => 4,
    ),
    '意大利' => array(
        '金牌' => 3,
        '银牌' => 4,
        '铜牌' => 2,
    ),

);
// 实现 ORDER BY
foreach($arr as $k => $v) {
    $sort['金牌'][$k] = $v['金牌'];
    $sort['银牌'][$k] = $v['银牌'];
    $sort['铜牌'][$k] = $v['铜牌'];
}
array_multisort(
    $sort['金牌'], SORT_DESC, 
    $sort['银牌'], SORT_DESC, 
    $sort['铜牌'], SORT_DESC, 
    $arr);
var_export($arr);</code>

來個python版的,假設每個國家每種獎牌數不會超過999。

<code>arr = [
    {'name':'国家一','score':[10,7,5]},
    {'name':'国家二','score':[10,9,5]},
    {'name':'国家三','score':[11,7,5]},
    {'name':'国家四','score':[10,7,9]},
]

print sorted(arr, key=lambda a: '%03d%03d%03d' % tuple(a['score']), reverse=True)</code>

score在設計時最好分開。
設計一個類別(含國家,金,銀,銅數),實作Comparable接口,依照你所描述的規則實作compare方法。這不是很簡單嗎?

金牌+銀牌+銅牌+id組成一個數字然後排序然後直接排序,如id13-【10,2,20】組成10022013,然後根據這個數字直接排序即可

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn