2014-12-07 2 views
0

Мне нужна небольшая помощь в сортировке разбитого массива в наивысшем до наименьшего, сохраняя имена рядом с оценками. Я немного не уверен, как это сделать, потому что массив разбит.Как отсортировать массив строк и ints?

Это код, который у меня есть до сих пор.

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]); 
       } 
      } 

      dynamic swap; 
      for (int i = 0; i < score.Length - 1; i++) 
      { 
       for (int j = i + 1; j < score.Length; j++) 
       { 
        swap = score[i]; 
        score[i] = score[j]; 
        score[j] = swap; 

        swap = name[i]; 
        name[i] = name[j]; 
        name[j] = swap; 
       } 
      } 

      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); 
     } 
    } 
} 
+9

Я бы настоятельно рекомендовал использовать * единственную * коллекцию обоих оценок и имен, объединенных в класс 'Player' или что-то подобное. См. Http://codeblog.jonskeet.uk/2014/06/03/anti-pattern-parallel-collections/ –

ответ

0

попробовать это для сортировки массива

dynamic swap; 
for (int i = 0; i < score.length - 1; i++) 
    for(int j = i + 1; j < score.length; j++) 
    { 
     if (score[i] < score[j]) 
     { 
      swap = score[i]; 
      score[i] = score[j]; 
      score[j] = swap; 

      swap = name[i]; 
      name[i] = name[j]; 
      name[j] = swap; 
     } 
    } 

и использовать это идеальный счет

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]); 
    } 
} 
+0

Вы не можете быть серьезным предположить, что алгоритм 'O (n * n)' для сортировки, который также не имеет значения, Я ничего не скажу. –

+0

@upvoter, что мне не хватает? –

+0

Ну, так как он не использует классы, это должно отлично работать –

2

Лично я хотел бы использовать класс для представления игроков, так что вы можете держите имена и оценки вместе. Что-то вроде:

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

Затем, вы можете получить высокий, низкий и средний, как это:

private static void Main(string[] args) 
{ 
    // Of course this list could be generated from user input, and the scores 
    // would start at 0, incrementing as play progressed. This is just for example. 
    var players = new List<Player> 
    { 
     new Player {Name = "Abe", Score = 140}, 
     new Player {Name = "Bert", Score = 200}, 
     new Player {Name = "Charlie", Score = 150}, 
     new Player {Name = "Donald", Score = 300}, 
     new Player {Name = "Ernie", Score = 120}, 
    }; 

    var maxScore = players.Max(p => p.Score); 
    var minScore = players.Min(p => p.Score); 

    foreach (var player in players.Where(p => p.Score == maxScore)) 
    { 
     // Note the inline check for a perfect score, which adds a '*' after it 
     Console.WriteLine("Congratulations {0}, your score of {1}{2} was the highest.", 
      player.Name, player.Score, maxScore == 300 ? "*" : ""); 
    } 

    foreach (var player in players.Where(p => p.Score == minScore)) 
    { 
     Console.WriteLine("{0}, your score of {1} was the lowest. " + 
      "Better get some practice.", player.Name, player.Score); 
    } 

    Console.WriteLine("The average score for this game was {0}.", 
     players.Average(p => p.Score)); 
} 

И если вы хотите, чтобы отсортировать список игроков по счету, вы можете сделать что-то подобное :

// This will sort the list by the score, with the highest score first 
// Just for fun, it then sorts any ties by the player name 
players = players.OrderByDescending(p => p.Score).ThenBy(p => p.Name).ToList(); 

Console.WriteLine("Here are all the players and their scores:"); 
players.ForEach(p => Console.WriteLine(" - {0}: {1}", p.Name, p.Score)); 
0

Мой ответ немного отличается. Если это не проблема школы, и ваш учитель хочет, чтобы вы записали свой собственный вид, я бы написал класс, который хранит все данные Score и реализует IComparable и использует метод List.Sort для сортировки. Затем я переопределяю метод класса ToString для отображения оценки так, как вы хотите.

Класс для хранения данных:

public class BowlingScore : IComparable<BowlingScore> 
{ 
    private int _score = 0; 

    public string Name { get; set; } 

    public bool IsPerfectGame { get; protected set; } 

    public int Score 
    { 
     get { return this._score; } 

     set 
     { 
       this._score = value; 
       this.IsPerfectGame = value == 300; 
     } 
    } 

    public override string ToString() 
    { 
     if (this.IsPerfectGame) 
     { 
      return string.Format("{0}'s score was {1}*", this.Name, this.Score); 
     } 
     else 
     { 
      return string.Format("{0}'s score was {1}", this.Name, this.Score); 

     } 
    } 

    public int CompareTo(BowlingScore other) 
    { 
     return this.Score.CompareTo(other.Score); 
    } 
} 

код для заполнения Список BowlingScore-х и сортировки от низкого до высокого и показывать высокий, низкий и средний балл. Обратите внимание, что вы можете иметь более 1 высокий и низкий балл.

 List<BowlingScore> scores = new List<BowlingScore>() 
     { 
      new BowlingScore() { Name = "Joe", Score = 278}, 
      new BowlingScore() { Name = "Pete", Score = 300}, 
      new BowlingScore() { Name = "Lisa", Score = 27}, 
      new BowlingScore() { Name = "Trevor", Score = 50}, 
      new BowlingScore() { Name = "Jim", Score = 78}, 
      new BowlingScore() { Name = "Bob", Score = 27}, 
      new BowlingScore() { Name = "Sally", Score = 50}, 
     }; 

     Console.WriteLine(); 
     Console.WriteLine("Here are the Scores:"); 

     scores.Sort(); 

     foreach (BowlingScore score in scores) 
     { 
      Console.WriteLine(score); 
     } 

     Console.WriteLine(); 
     HighScores(scores); 

     Console.WriteLine(); 
     LowScores(scores); 

     Console.WriteLine(); 
     Console.WriteLine(string.Format("Average score:{0}", scores.Average(f => f.Score))); 

     Console.WriteLine(); 
     Console.WriteLine("Press any key..."); 
     Console.ReadKey(); 

    static void HighScores(List<BowlingScore> scores) 
    { 
     int highScore = scores.ElementAt(scores.Count - 1).Score; 

     for(int index = scores.Count -1; index > 0; index--) 
     { 
      BowlingScore bowlingScore = scores.ElementAt(index); 

      if (bowlingScore.Score == highScore) 
      { 
       Console.WriteLine(string.Format("High Score: {0} {1}", bowlingScore.Name, bowlingScore.Score)); 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 

    static void LowScores(List<BowlingScore> scores) 
    { 
     int lowScore = scores.ElementAt(0).Score; 

     for (int index = 0; index < scores.Count; index++) 
     { 
      BowlingScore bowlingScore = scores.ElementAt(index); 

      if (bowlingScore.Score == lowScore) 
      { 
       Console.WriteLine(string.Format("Low Score: {0} {1}", bowlingScore.Name, bowlingScore.Score)); 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
+0

ОП использует высокие, низкие и средние баллы в квесте. Считаете ли вы, что это нужно * сортировка *? Достаточно одного решения '(O (n))'. –

+0

** a) ** Считаете ли вы, что ваш комментарий доступен для чтения ** b) ** Что будет 'scores.First()' return Если он не отсортирован (не забывайте, что вам не нужна сортировка) ** c) **, Как вы думаете, это эффективный способ повторения в списке много раз, например '* scores.First(). Имя * и * scores.First(). Score *' –

+0

Вам все еще не нужно * Сортировать * найти * мин, макс, средний *. Достаточно одного цикла. Нет необходимости в алгоритме 'O (n * log (n))'. –

Смежные вопросы