Узнайте самые популярные из разных результатов - PullRequest
0 голосов
/ 17 февраля 2011

Это скорее математический вопрос, чем вопрос программирования, но он все еще включает в себя некоторое программирование.

Эта программа собирает информацию из списков пользователей на веб-сайте 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);
        }


    }

Что бы я сделал, чтобы он точно ранжировал их, даже когда никогда не было одинаковых игроков?

Это очень важно для меня, и я был бы очень благодарен за ответ.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2011

ОК, а как насчет 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);
}

EDIT

Изменен, чтобы выглядеть как код ОП. Я настоятельно рекомендую вам потратить некоторое время на этот учебник 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);
}
0 голосов
/ 17 февраля 2011

У вас есть отношения игроков для каждого списка, но вы хотите, чтобы отношения игроков в целом. Предполагая, что это разрешимо (т. Е. Есть информация для ранжирования каждого игрока, и нет случаев, когда игрок 1 и 2 побили друг друга)

Алгоритм будет выглядеть примерно так:

  1. Получить первого игрока рейтинга в первом списке. Пройдите через первый элемент каждого оставшегося списка, чтобы увидеть, если этот игрок побежден. Если да, замените его на игрока, который его победил, иначе он номер один.

  2. Удалить этого игрока из списка.

  3. Повторить с 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...