【问题标题】:Find out most popular from different results从不同的结果中找出最受欢迎的
【发布时间】:2011-02-17 04:32:00
【问题描述】:

这更像是一个数学问题而不是编程问题,但它仍然包含一些编程。

这个程序从 IMDB 网站上的用户列表中抓取信息,并且应该显示所有输入列表中最受欢迎的名人。这行得通,只是显示不准确的结果。

这就是我所拥有的:

            public List<Star[]> stars = new List<Star[]>();

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Processing...";
        stars.Add(ParseList(textBox1.Text));

        label1.Text = "Waiting.";

        treeView1.Nodes.Clear();

        List<Star> strs = new List<Star>();

        foreach (Star[] stlst in stars)
        {
            foreach (Star s in stlst)
            {
                bool inalrdy = false;

                int index = 0;

                for (int i = 0; i < strs.Count; i++)
                {
                    if (s.Name == strs[i].Name)
                    {
                        inalrdy = true;
                        index = i;
                        break;
                    }
                }

                if (inalrdy)
                {
                    strs[index].Points += s.Points;
                }
                else
                {
                    strs.Add(s);
                }
            }
        }

        foreach (Star s in strs)
        {
            treeView1.Nodes.Add(s.Points + ". " + s.Name);
        }


    }

即使没有相同的玩家,我该怎么做才能准确地对他们进行排名?

这对我来说非常重要,如果能得到答复,我将不胜感激。

【问题讨论】:

  • 在这个例子中,你在哪里声明变量s?
  • 所以你想要的是某种系统,可以跟踪谁击败/输给了其他所有玩家。我假设如果 a 击败 b 那么 b 在另一个结果中不能击败 a。
  • s 应该是 p,不小心改了。
  • 这应该使用所有游戏的排名数据并创建准确的排行榜。
  • 如果 plrs 是 List 那么你应该有 foreach (Player p in plrs) 而不是 foreach (Player[] pllst in plrs)

标签: c# algorithm math


【解决方案1】:

你有每个列表的玩家关系,但你想要的是整体的玩家关系。 假设这是可以解决的(即有信息可以对每个玩家进行排名,并且没有玩家 1 和 2 互相击败的情况)

算法看起来像:

  1. 获取第一个列表中排名第一的玩家。遍历每个剩余列表的第一个元素以查看该玩家是否被击败。如果是,则替换为击败他的玩家,否则他是第一。

  2. 从列表中删除该播放器。

  3. 从 1 开始重复。

【讨论】:

    【解决方案2】:

    好的,那么一些LINQ 怎么样?

    类似

    public class Player
    {
        public string Name;
        public double Rank;
    }
    
    List<List<Player>> someOtherList = new List<List<Player>>
                                       {
                                           new List<Player> 
                                               {
                                                   new Player {Name = "A", Rank = 1}, 
                                                   new Player {Name = "B", Rank = 2}
                                               },
                                           new List<Player>
                                               {
                                                   new Player {Name = "A", Rank = 2}, 
                                                   new Player {Name = "C", Rank = 1}
                                               }
                                       };
    
    List<Player> plrs = 
            (from p in someOtherList.SelectMany(singleList => singleList)
            group p by p.Name into g
             select new Player { Name = g.Key, Rank = g.Average(x => x.Rank) })
             .OrderBy(x => x.Rank)
             .ToList();
    
    foreach (Player p in plrs)
    {
        OverallPlayers.Add(p.Rank + ". " + p.Name);
    }
    

    编辑

    更改为类似于 OP 代码。一旦你感觉好些,我强烈建议你花一些时间在那个 LINQ 教程上......

    List<Star[]> stars = new List<Star[]>
                                           {
                                               new[]
                                                   {
                                                       new Star {Name = "A", Points = 1}, 
                                                       new Star {Name = "B", Points = 2}
                                                   },
                                               new[]
                                                   {
                                                       new Star {Name = "A", Points = 2}, 
                                                       new Star {Name = "C", Points = 1}
                                                   }
                                           };
    List<Star> plrs =
            (from p in stars.SelectMany(singleList => singleList)
            group p by p.Name into g
             select new Star { Name = g.Key, Points = g.Average(x => x.Points) })
             .OrderBy(x => x.Points)
             .ToList();
    
    foreach (Star p in plrs)
    {
        //OverallPlayers.Add(p.Rank + ". " + p.Name);
    }
    

    【讨论】:

    • 我不太明白。您能否编辑它,以便我可以复制并粘贴到我的代码中(这与我更新的帖子完全相同)。我病了,不能真正考虑狭隘,所以我会非常亲切。
    • 等等,仅使用平均值仍然不会得到准确的答案。如果某人在一个列表中排名第一,但甚至不在所有其他列表中,他们仍将被视为第一。
    • 不幸的是,这就是平均值会给你的。我可以看到这项工作的另一种方式是,您为每个位置分配某种重量/数字,然后将它们数起来。我假设您的列表从 1 向下运行,因此仅添加这些“排名”也不会产生所需的结果。您必须将积分分配给给定位置,就像他们在 F1 比赛中所做的那样。因此,即使一个人只参加了一次,并且先来,他们也不会赢得奖杯。你知道我在做什么吗?
    • 好的,我看看我能做什么。
    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多