繁体   English   中英

如何对拆分数组进行排序以从高到低读取?

[英]How do I sort a split array to read highest to lowest?

我需要一些帮助,将拆分数组从高到低排序,同时将名称保持在分数旁边。 我有点不确定如何执行此操作,因为数组已拆分。 另外,有没有一种方法可以让用户输入所需的名称和分数,而程序不会给用户带来错误? 因此,如果他们只想输入4个姓名和分数,他们所要做的就是按Enter键?

这是我到目前为止的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace proj09LEA
{
    class Program
    {
        static void Main(string[] args)
        {
            // declare and array of integers          
            string[] name = new string[5];
            int[] score = new int[5];

            Console.WriteLine("\nSaturday Coder's Bowling Team");
            Console.WriteLine("Enter in a name and score for each person on the team.");
            Console.WriteLine("For example, Mary 143. Just hit Enter when you are done.\n");

            // fill an array with user input
            for (int i = 0; i < score.Length; i++)
            {
                Console.WriteLine("Enter in a name and score: ");
                string line = Console.ReadLine();

                name[i] = line.Substring(0, line.IndexOf(' '));
                score[i] = int.Parse(line.Substring(line.IndexOf(' ') + 1));
            }

            Console.WriteLine("------------ Input Complete ------------\n");
            Console.WriteLine("Here are the scores for this game, from highest to lowest:\n");

            for (int i = 0; i < score.Length; i++)
            {
                if (score[i] >= 300)
                {
                    Console.WriteLine("{0}'s score was {1}*.", name[i], score[i]);
                }
                else
                {
                    Console.WriteLine("{0}'s score was {1}.", name[i], score[i]);
                }
            }

            AverageScore(score);

            Console.WriteLine("Press Enter to continue. . .");
            Console.ReadLine();
        }

        static void AverageScore(int[] score)
        {
            int sum = score.Sum();
            int average = sum / score.Length;
            Console.WriteLine("The average score for this game was {0:d}.\n", average);
        }
    }
}

首先让我解决无限玩家问题。 如您所知,数组的大小在创建时就固定了。 不过,有一个数据结构List ,它可以具有无限制(实际上是)数量的元素。 您可以这样创建一个:

List<string> names = new List<string>();

然后,如果要添加新名称,则可以使用

names.Add("Mary");

您的其余代码应大致相同。 索引工作正常,求和工作正常,等等。


现在如何将它们分类在一起呢? 好吧,您实际上并没有名称列表和分数列表。 您真正在语义上拥有的是一对名称和分数对的列表,或者一个玩家列表。 您可以首先定义一个代表玩家的结构:

struct Player {
    public string Name { get; set; }
    public int Score { get; set; }

    public Player(string name, int score) {
        Name = name;
        Score = score;
    }
}

然后,您可能只有一个玩家列表:

List<Player> players = new List<Player>();

除了将名称和分数分开添加之外,我们将它们加在一起:

string name = /* ... */;
int score = /* ... */;
players.Add(new Player(name, score));

这样表示,您的打印例程也变得更加简单。 您可以一次遍历两者:

foreach(Player player in players) {
    Console.WriteLine("{0} scored {1}", player.Name, player.Score);
}

最后,求和有点棘手,但不是太难。 基本上,我们提取所有分数并将它们相加:

int sum = players.Select((player) => player.Score).Sum();

但是对您来说,真正的好处是最终能够对其进行排序:

players.Sort((x, y) => y.Score - x.Score);

您基本上需要的是看看专门用于此目的的ADT的HashMap 它们的结构如下:
-key1:value1
-key2:值2
.....
-keyn:价值
您的关键是您的分数(但可以是任何分数)。 该值将是与分数相关的名称。
然后,根据您的实现,您可以创建方法sortKeys,该方法将把HashMap中的每个键都移到末尾或开头,同时指向您的名称。
但是请注意,一些HashMap是随机存储的,因此您可能必须制作一个数组以编写键的排序顺序(然后在HashMap中查找键的值)。

首先使用Arrays.sort方法对数组进行排序,然后从

 for(int i= x.length-1;i>=0;i--)
     System.out.print(x[i]+"");

应该这样

列表将是一个更好的选择,并且这些内置的排序选项使您的工作更加轻松。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM