【问题标题】:How can I sort a multidimensional array by the highest value of each row?如何按每行的最大值对多维数组进行排序?
【发布时间】:2014-07-09 06:38:04
【问题描述】:

我正在开发一个系统来跟踪球员、他们的三个得分,然后找出获胜者。获胜者是在三个个人拍摄中得分最高的人。所以换句话说,分数不会相加,重要的是他们的最高分数。

例如,我刚刚在这里硬编码了值。数组的第一个索引号按名称的顺序排列。所以约翰得到了 42、38 和 43 分等等。

    string[] player = {"John", "Jack", "Joe", "Jim", "Jacob"};
    int[,] stats = {
               {42, 38, 43},
               {37, 36, 39},
               {35, 40, 37},
               {41, 44, 38},
               {33, 34, 37}
               };

现在我想创建一个函数来识别这三个尝试中哪个玩家得分最高,并按名称顺序显示三个最高得分(每人一个)。 所以标签中的输出最终会是这样的::

  • 1.) 吉姆 - 44
  • 2.) 约翰 - 42
  • 3.) 乔 - 40

因此,正如我所见,问题出现了,必须检查每一行的最高值,然后可以创建一个新数组,同时仍然跟踪谁拥有分数,以正确打印它。 (我是新手。)有人知道如何实现这个结果吗?

【问题讨论】:

  • 您似乎了解解决问题所需的步骤。你被困在哪里了?
  • 多维数组很少是存储数据的好选择。对它们执行查询、聚合或转换的 API 支持并不多。您是否需要为此使用多维数组?
  • 如果我们可以使用 List 和“播放器”对象来做到这一点,这将变得非常容易。这是一个可以接受的解决方案吗?
  • 我建议使用for 循环在 C# 中进行编程。然后,您可以继续使用更优雅的解决方案,例如 LINQ。尝试一下,当你遇到困难时向我们展示你的代码。

标签: c# arrays sorting multidimensional-array


【解决方案1】:

Linq 有一个很酷的功能,称为“Zip”,它基本上就像两个可枚举集合上的拉链。它逐项进行,并根据每个集合中相同索引处的项目创建结果。

所以你可以这样做:

 player.Zip(stats,(p,i) => new { Player = p, HighScore = i.Max() })
       .OrderBy(m => m.HighScore)

然后您可以对该结果进行 foreach 以按顺序打印我们的获胜者。

编辑:不是 100% 确定这将与多维数组一起使用。希望它能让你朝着正确的方向前进。

【讨论】:

  • 问题是一个矩形数组实际上是一个单一的集合——它不是一个像锯齿状数组那样的序列序列。我认为您不能应用 Zip 运算符将一个维度与其他维度分开。
  • 简洁的解决方案,但不需要额外的课程。好主意!
  • @Mike,是的,我认为你是对的。哦,好吧..这将是一种很好的简化方式。
【解决方案2】:
public class Player
        {
            public string Name { get; set; }
            public List<int> Score { get; set; }
        }

List<Player> playerList = new List<Player>();
            playerList.Add(new Player() { Name = "John", Score = new List<int>() { 42, 38, 43 } });
            playerList.Add(new Player() { Name = "Jack", Score = new List<int>() { 37, 36, 39 } });
            playerList.Add(new Player() { Name = "Joe", Score = new List<int>() { 35, 40, 37 } });
            playerList.Add(new Player() { Name = "Jim", Score = new List<int>() { 41, 44, 38 } });
            playerList.Add(new Player() { Name = "Jacob", Score = new List<int>() { 33, 34, 37 } });

        var result2 = from p in playerList orderby p.Score.Max() descending select p;
var result = from p in playerList where p.Score.Max() == ((from x in playerList select new { x.Name, MaxScore = x.Score.Max() }).Max(x => x.MaxScore)) select p;

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2011-03-17
    • 1970-01-01
    • 2018-03-01
    • 2019-02-22
    相关资源
    最近更新 更多