【问题标题】:student ranking ties score php code学生排名关系分数php代码
【发布时间】:2013-08-21 01:27:58
【问题描述】:

请帮助我用一个公式进行排名,例如:

std_no    score        rank  

 1        50           1
 4        45           2
 3        45           3
 2        45           4
 5        45           5
 6        30           6

上面的例子是正确的,但我想要这个。

std_no   score        rank  

 1       50            1
 4       45            3.5
 3       45            3.5
 2       45            3.5
 5       45            3.5
 6       30            6

我如何获得 3.5?公式排名。 2,3,4,5相加除以4,就是同等级45的数量。

【问题讨论】:

  • 至少显示你的代码
  • 一般情况下,4个成绩相同的学生都应该是第2而不是3.5。
  • std_no 不应该是唯一的?因为那是 2 std_no 1
  • 但公式是将所有相同分数的排名相加并除以相同分数的数量
  • @binogure 抱歉输入错误

标签: php ranking


【解决方案1】:

因为没有指定标签或语言我选择perl(转换为php:http://www.cs.wcupa.edu/~rkline/perl2php/):

    #!/usr/bin/perl

    use strict;
    use warnings;
    use Data::Dumper;
    use Clone qw(clone);

    sub _minRank
    {
        my ($couple, $tmpInput)    = @_;
        my $minRank                = @$couple[1];

        foreach my $key (keys %{$tmpInput}) {
            my $StudentCouple = $tmpInput->{$key};

            if (@$StudentCouple[0] == @$couple[0] && @$StudentCouple[1] < $minRank) {
                $minRank = @$StudentCouple[1];
            }
        }
        return $minRank;
    }

    sub _maxRank
    {
        my ($couple, $tmpInput)    = @_;
        my $maxRank                = @$couple[1];

        foreach my $key (keys %{$tmpInput}) {
            my $StudentCouple = $tmpInput->{$key};

            if (@$StudentCouple[0] == @$couple[0] && @$StudentCouple[1] > $maxRank) {
                $maxRank = @$StudentCouple[1];
            }
        }
        return $maxRank;
    }

    sub _nbIteration
    {
        my ($couple, $tmpInput)    = @_;
        my $nbIteration            = 0;

        foreach my $key (keys %{$tmpInput}) {
            my $StudentCouple = $tmpInput->{$key};

            if (@$StudentCouple[0] == @$couple[0]) {
                $nbIteration++;
            }
        }

        return $nbIteration;
    }

    sub _computeRank
    {
        my ($couple, $tmpInput) = @_;

        my $tmpInput1   = $tmpInput;
        my $nbIteration = _nbIteration($couple, $tmpInput1);
        my $rank        = @$couple[1];

        if ($nbIteration > 1) {
            my $tmpInput2   = $tmpInput;
            my $minRank     = _minRank($couple, $tmpInput2);

            my $tmpInput3   = $tmpInput;
            my $maxRank     = _maxRank($couple, $tmpInput3);

            $rank = ($minRank + $maxRank) / 2;
        }

        return $rank;
    }

    #         Std_no => [score, rank]
    my %input = (  1 => [50, 1], 
                   4 => [45, 2], 
                   3 => [45, 3], 
                   2 => [45, 4],
                   5 => [45, 5], 
                   6 => [30, 6] );

    my %output = %{clone(\%input)};

    foreach my $key (keys %input) {
        my $StudentCouple  = $input{$key};
        my %tmpInput       = %input;
        my $outputCouple   = $output{$key};

        @$outputCouple[1] = _computeRank($StudentCouple, \%tmpInput);
    }

    print Dumper(\%output);

希望对你有帮助。

警告!这段代码没有优化!!

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2014-10-08
    相关资源
    最近更新 更多