Массив для сортировки рекордов

1

Я работаю над проектом на С#, который включает в себя отслеживание пятерки лучших результатов для игры с ножницами из каменной бумаги. Прямо сейчас у меня есть массив, который удерживает верхние пять баллов (которые являются целыми числами), я сортирую массив в порядке убывания, и я использую цикл for, чтобы сравнить счет, который только что заработал пользователь, и баллы, находящиеся в настоящее время в массиве. Если новый балл выше, чем один в массиве, сейчас новый счет просто занимает пространство в массиве, которое занял нижний.

Например, если баллы были 9, 8, 5, 3, 1, а пользователь набрал 6, баллы выглядели бы так: 9, 8, 6, 3, 1. Я задавался вопросом, есть ли способ для меня сдвиньте нижние оценки и вставьте новый, чтобы список выглядел так: 9, 8, 6, 5, 3.

Это код, который я сейчас имею, где successPercent - это оценка, рассчитанная как выигрыши, разделенные на потери и связи:

int[] scoreArray = { 84, 25, 36, 40, 50 };

Array.Sort(scoreArray);
Array.Reverse(scoreArray);

for (int x = 0; x <= scoreArray.Length; ++x)
{
    if (successPercent > scoreArray[x])
    {
        scoreArray[x] = Convert.ToInt32(successPercent);
        break;
    }
}
Теги:
arrays
sorting

3 ответа

0
Лучший ответ

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

[Algo]: замените наименьшее число на новый номер, а затем отсортируйте!

int[] scoreArray = { 5, 3, 9, 8, 1 };

        int new_number = 6;

        //Replaces smallest number by your new number
        int min_index = Array.IndexOf(scoreArray, scoreArray.Min());
        scoreArray[min_index] = new_number;

        Array.Sort(scoreArray);
        Array.Reverse(scoreArray);
4

Что-то вроде этого может сделать трюк:

  • Создание временного списка
  • Добавить новый счет
  • Сортировка по убыванию
  • Возьмите 5 лучших...

    int[] scoreArray = { 84, 25, 36, 40, 50 };
    
    var tempList = new List<int>(scoreArray );
    int newScore = ...;//Get the new score
    tempList.Add(newScore);
    
    scoreArray = tempList.OrderByDescending(x=>x)
                     .Take(5)
                     .ToArray();
    
0

Я считаю, что ваш путь правильный и более эффективный, чем создание избыточных списков, просто вы вызываете ненужный метод Reverse вызова. Вместо этого оставьте свои элементы отсортированными в порядке возрастания, затем пройдите по массиву и отсортируйте его в порядке убывания.

int[] scoreArray = { 84, 25, 36, 40, 50 };
int userScore = 100;

Array.Sort(scoreArray);

for (int x = 0; x <= scoreArray.Length; ++x)
{
     if (userScore > scoreArray[x])
     {
         scoreArray[x] = Convert.ToInt32(userScore);
         break;
     }
}

Array.Sort(scoreArray,(x,y) => y.CompareTo(x));

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню