Мне нужно найти максимальное значение в массиве с C # - PullRequest
0 голосов
/ 31 января 2019

У меня многомерный массив с пятью странами и несколькими медалями.Последний столбец - это сумма, и мне нужно вернуть страну с наибольшим количеством медалей.Мой код «работает», пока нет двух стран с одинаковым количеством медалей и с максимальным числом.Вероятно, у меня просто недостаточно опыта работы с массивами, но как я могу вернуть более одной страны, если мне нужно?

string [,] medals = new string[5, 5];

        Random rdn = new Random();

        medals[0, 0] = "Brazil";
        medals[1, 0] = "USA";
        medals[2, 0] = "Russia";
        medals[3, 0] = "France";
        medals[4, 0] = "Egypt";

        for (int i = 0; i < medals.GetLength(0); i++)
            for (int j = 1; j < medals.GetLength(1); j++)
            {
                //This fills the gold, silver and copper medals
                if (j < medals.GetLength(1)-1)
                    medals[i, j] = rdn.Next(1, 6).ToString();
                else
                    //This fills the total medals
                    medals[i, j] = (int.Parse(medals[i, 1]) + int.Parse(medals[i,2]) + int.Parse(medals[i,3])).ToString();
            }

        //The first index stores the max number so far and the second stores the name of the country
        string [] winner = { "0", "0" };

        for (int i = 0; i < medals.GetLength(0); i++)
        {
            if (int.Parse(medals[i,4]) > int.Parse(winner[0]))
            {
                winner[0] = medals[i, 4];
                winner[1] = medals[i, 0];
            }
        }

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Словарь будет гораздо проще для начала.Затем вы можете просто отсортировать на основе значений в dict и использовать простой цикл для проверки дубликатов значений.

0 голосов
/ 31 января 2019

Есть много вещей, которые я бы сделал по-другому, чем вы, но это помимо сути (см. Примечание в конце).Ваша проблема в том, как справиться с ситуацией, когда у вас есть несколько стран с равным и максимальным количеством медалей.

Как вернуть несколько стран?

Ну, это легко: представьте, что вы возвращаете победителя из приведенной ниже функции:

string[] GetWinner() {
    // your code
    return new[] { "20", "USA" };
}

Тогда нет никаких изменений в типе данных, просто добавьте другую страну в массив, и вызывающий код должен проверить, сколько у вас есть

string[] GetWinner() {
    // your code
    return new[] { "20", "USA", "CAN" };
}

Теперь, если у вас есть проблема относительно того, как создать массив, размер которого неизвестен при его создании, тогда обычное решение - использовать List<>, который в этом случае будет действовать как массив с изменяемым размеромдля вас.

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

static string[]  GetWinner(string[,]  medals) {

    int rows = medals.GetLength(0);

    var winners = new List<string>();
    int maxMedals = 0;
    for (var i = 0; i < rows; i++) {
        var n = int.Parse(medals[i, 4]);
        maxMedals = n > maxMedals ? n : maxMedals;
    }

    for (var i = 0; i < rows; i++) {
        var n = int.Parse(medals[i, 4]);
        if (n == maxMedals)
            winners.Add(medals[i, 0]);
    }

    winners.Insert(0, maxMedals.ToString());

    return winners.ToArray();
}

Теперь я бы посоветовал вам использовать более совершенную структуру данных для хранения ваших медалей.Но так как я не знаю всей ситуации, я думаю, что-то вроде ниже разумно.Вместо использования именованных типов вы можете использовать ValueTuple - чтобы сделать код кратким, если код, связанный с этими объектами, ограничен небольшой областью файла кода.Это должно избегать выделения большого куска памяти, связанного с 2D-массивами, а также хранения int в строке.

public class CountryMedalTally {
    public string Country { get; set; }
    public string[] Medals { get; set; }
    public int MedalCount { get; set; }
}

public class Winner {
    public List<string> Country { get; set; }
    public int MedalCount { get; set; }
}

List<CountryMedalTally> AllMedals;
0 голосов
/ 31 января 2019

Вы можете использовать список для хранения победителей.

var listWinners = new List<KeyValuePair<string,string>>();

for (int i = 0; i < medals.GetLength(0); i++)
{
    if ((listWinners.Count() == 0)||(int.Parse(medals[i,4]) > int.Parse(listWinners.First().Value)))
    {
        listWinners.Clear();
        listWinners.Add(new KeyValuePair<string,string>(medals[i,0],medals[i,4]));
    }

    else if (int.Parse(medals[i,4]) == int.Parse(listWinners.First().Value))
    {
    listWinners.Add(new KeyValuePair<string,string>(medals[i,0],medals[i,4]));
    }
}

Но я хотел бы повторить то, что было сказано в комментариях, было бы намного лучше, если бы вы могли использовать Список объектов, а немногомерный массив.Это повысит вашу читабельность кода и сделает все намного проще.

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