简体   繁体   English

如何使用字符串和整数对文本文件进行排序

[英]How to sort a text file with strings and integers

I have recently been trying to make a code that sorts my text file into a text box, like a leader board.我最近一直在尝试编写一个代码,将我的文本文件分类到一个文本框中,比如排行榜。 I have been trying to sort it by the high score or just alphabetically我一直在尝试按高分或按字母顺序排序

这是文本文件的保存方式

How would I sort these using an insert or bubble sort?我将如何使用插入或冒泡排序对这些进行排序?

If you want to sort something you have to break the data into an object that holds the individual parts in separated properties.如果您想对某些内容进行排序,您必须将数据分解为一个对象,该对象将各个部分保存在不同的属性中。 Then you write an comparer for the kind of objects and apply that comparer.然后您为该类型的对象编写一个比较器并应用该比较器。

Example with Comparer class:比较器类的示例:

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}";
}

Depending on your needs you can also replace the usage of the comparer class with a LINQ query:根据您的需要,您还可以使用 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);
        }
    }
}

You can simply do this:你可以简单地这样做:

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

The error handling for int.Parse and line.Split has been left out.忽略了 int.Parse 和 line.Split 的错误处理。

Method2:方法二:

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

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

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