【问题标题】:user defined sorting functions, how to properly use them?用户自定义排序函数,如何正确使用?
【发布时间】:2013-09-01 14:44:55
【问题描述】:

我一直用这种方法来完成这种排序, 但对我来说看起来不正确

usort($array, function($team1, $team2){

    $t1 = ($team1->points * 1000) + ($team1->goalsFor - $team1->goalsAgainst);
    $t2 = ($team2->points * 1000) + ($team2->goalsFor - $team2->goalsAgainst);

    if($t1 == $t2) return 0;
    return $t1 > $t2 ? 1 : -1;
});

此方法的替代方法是使用 str_pad,其作用几乎相同


基本上我所做的是将排序主题用零分隔

$t1 = 32008; // 32 points with a GD of 8
$t2 = 32003; // 32 points with a GD of 3

但是,如果一支球队出现了奇怪的目标差异怎么办?

$t1 = 32008; // 32 points with a GD of 8
$t2 = 33000; // 32 points with a GD of 1000

显然这不可能发生,但这是一个例子

这是一个好方法吗? 32-64 位/浮点数 [im] 精度限制如何?

有人对此有什么建议吗?

谢谢你:)


请随意改进标题

【问题讨论】:

    标签: sorting math language-agnostic theory


    【解决方案1】:

    更好的方法是:

    function ($team1, $team2) {
        if ($team1->points != $team2->points) {
            return $team1->points > $team2->points ? 1 : -1;
        }
        $diff1 = $team1->goalsFor - $team1->goalsAgainst;
        $diff2 = $team2->goalsFor - $team2->goalsAgainst;
        if ($diff1 != $diff2) {
            return $diff1 > $diff2 ? 1 : -1;
        }
        return 0;
    }
    

    或者,在 Java 中(使用 Guava),我会这样写:

    public int compare(Team team1, Team team2) {
        return ComparisonChain.start()
                .compare(team1.getPoints(), team2.getPoints)
                .compare(team1.getGoalsFor() - team1.getGoalsAgainst(),
                         team2.getGoalsFor() - team2.getGoalsAgainst())
                .result();
    }
    

    显然,PHP 没有ComparisonChain,但实现起来应该不难。

    【讨论】:

    • 嗯,我显然选择了一个过于简单的例子,但我现在无法想象没有更好的了,但我记得我在使用特定规则进行排序时遇到了困难,比如“相关性乘数”或同等级别的排序科目。无论如何,这回答了这个问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多