与tiebreakers排名

时间:2014-05-31 20:03:27

标签: c# xna

如何根据一个标准对列表进行排名,然后根据另一个标准分离关系(其中可能有很多关系)?

我的(工作)尝试根据他们的总分数对驾驶员进行排名。

for (int j = 0; j < career.NumberOfDrivers; j++)
        {
            int rank = 1;

            for (int i = 0; i < career.NumberOfDrivers; i++)
            {
                if (career.driver[j].championshipPoints <   career.driver[i].championshipPoints)
                {
                    rank += 1;
                }
            }
            career.driver[j].championshipRank = rank;
        }

据说我之后想要循环检查关系 - 问题是当我有几个驱动程序绑在0时肯定会出现这种情况。

如何按字母顺序打破这些破坏者(即根据驾驶员姓名的第一个字母)?

编辑 - 我感兴趣的解决方案。在某些方面非常令人讨厌的黑客,但做的工作。

        List<Driver> tempDriver = new List<Driver>();

        for (int i = 0; i < career.driver.Count; i++)
        {
            tempDriver.Add(career.driver[i]);
        }


        tempDriver.Sort(
        delegate(Driver d1, Driver d2)
        {
            if (d1.championshipPoints == d2.championshipPoints)
            {
                return d1.Name.CompareTo(d2.Name);
            }
            return d1.championshipPoints.CompareTo(d2.championshipPoints);
        }
        );

        for (int i = 0; i < career.NumberOfDrivers; i++)
        {
            for (int j = 0; j < career.NumberOfDrivers; j++)
            {
                if (career.driver[i].Name == tempDriver[j].Name)
                {
                    career.driver[i].championshipRank = j + 1;
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

您可以使用代理在驱动程序列表中使用Sort()。 如果驾驶员具有相同的分数,则返回其姓名的比较结果。 否则返回比较或他们的分数

driversList.Sort(
    delegate(Driver d1, Driver d2)
    {
        if (d1.championshipPoints == d2.championshipPoints)
        {
            return d1.name.CompareTo(d2.name);
        }
        return d1.championshipPoints.CompareTo(d2.championshipPoints);
    }
);

然后,驱动程序的排名只是排序列表中的索引。

编辑:

此解决方案具有n * log(n)复杂度(OP首次尝试为O(n ^ 2))