【问题标题】:How to sort a text file with strings and integers如何使用字符串和整数对文本文件进行排序
【发布时间】:2020-04-10 23:40:27
【问题描述】:

我最近一直在尝试编写一个代码,将我的文本文件分类到一个文本框中,比如排行榜。我一直在尝试按高分或按字母顺序对其进行排序

如何使用插入排序或冒泡排序对它们进行排序?

【问题讨论】:

  • 您可以查找冒泡排序或插入排序的算法,然后在您的代码中实现它。您还可以使用内置方法,例如 Array.SortOrderBy。 Stack Overflow 不是代码编写服务,请展示您的尝试或阅读How to Ask
  • 如果你在 C# 中,为什么 C# 有扩展排序方法时插入或冒泡排序
  • 使用文件中的属性创建一个类或结构,例如(它是 json,在 C# 中相同) - ScoreData { name: '', score:0 } 然后使用 File.ReadAllLines 加载文件并将每一行反序列化为ScoreData 对象。你会得到一个像 ScoreData[] 这样的数组,你可以使用 scoreData.OrderBy(x => x.Score) 正常排序

标签: c# bubble-sort insertion-sort


【解决方案1】:

如果您想对某些内容进行排序,则必须将数据分解为一个对象,该对象将各个部分保存在单独的属性中。然后为对象类型编写一个比较器并应用该比较器。

Comparer 类示例:

public static class Program
{
    public static void Main()
    {
        var rawData = @"Guest 450
Ryan 300
Ryan 4850
Ryan 100
Guest 300
Guest 1800";

        var players = rawData
            .Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)
            .Select(row => row.Split())
            .Select(elements => new Player { Name = elements[0], Score = int.Parse(elements[1]) })
            .ToList();

        players.Sort(PlayerComparer.Default);

        foreach (var player in players)
        {
            Console.WriteLine(player);
        }
    }
}

public class PlayerComparer : IComparer<Player>
{
    public static readonly IComparer<Player> Default = new PlayerComparer();

    public int Compare(Player x, Player y)
    {
        if (x == null)
            return -1;

        if (y == null)
            return 1;

        var scoreComparison = y.Score - x.Score;

        if (scoreComparison != 0)
            return scoreComparison;

        return StringComparer.OrdinalIgnoreCase.Compare(x.Name, y.Name);
    }
}

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public override string ToString() => $"{Name} {Score}";
}

根据您的需要,您还可以将比较器类的用法替换为 LINQ 查询:

public static class Program
{
    public static void Main()
    {
        var rawData = @"Guest 450
Ryan 300
Ryan 4850
Ryan 100
Guest 300
Guest 1800";

        var players = rawData
            .Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)
            .Select(row => row.Split())
            .Select(elements => new Player { Name = elements[0], Score = int.Parse(elements[1]) })
            .ToList();

        var sortedPlayers = players
            .OrderByDescending(player => player.Score)
            .ThenBy(player => player.Name);

        foreach (var player in sortedPlayers)
        {
            Console.WriteLine(player);
        }
    }
}

【讨论】:

  • 为什么还要麻烦第一个解决方案?为什么不一直使用 LINQ?我对第二个解决方案的 +1
  • @SergeWautier:如果比较比较复杂,并且您希望将其封装在一个地方并在多个地方使用,那么比较器类更有意义。
【解决方案2】:

你可以这样做:

string path = "C:\\Users\\file\\Desktop\\test.txt";
string delim = ' ';

  string[] lines = File.ReadAllLines(path);
  List<Tuple<string, int>> users = new List<Tuple<string, int>>();

  foreach (string line in lines)
  {
    string[] keyValue = line.Split(delim);

    users.Add(new Tuple<string, int>(keyValue[0], int.Parse(keyValue[1])));
  }

  // sort by users
  users.Sort((x, y) => y.Item1.CompareTo(x.Item1));

  // sort by scores
  users.Sort((x, y) => y.Item2.CompareTo(x.Item2));

省略了对 int.Parse 和 line.Split 的错误处理。

方法二:

  string path = "C:\\Users\\user\\Desktop\\test.txt";

  // sorted scores
  var sortedPlayersByScores = File.ReadAllLines(path)
                                  .Select(line => line.Split(' '))
                                  .Select(elem => new 
                                   Tuple<string, int>(elem[0], int.Parse(elem[1])))
                                  .OrderBy(x => x.Item2);

  // sorted players by name
  var sortedPlayersByName = File.ReadAllLines(path)
                                .Select(line => line.Split(' '))
                                .Select(elem => new 
                                 Tuple<string, int>(elem[0], int.Parse(elem[1])))
                                .OrderBy(x => x.Item1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多