簡體   English   中英

如何使用字符串和整數對文本文件進行排序

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

我最近一直在嘗試編寫一個代碼,將我的文本文件分類到一個文本框中,比如排行榜。 我一直在嘗試按高分或按字母順序排序

這是文本文件的保存方式

我將如何使用插入或冒泡排序對這些進行排序?

如果您想對某些內容進行排序,您必須將數據分解為一個對象,該對象將各個部分保存在不同的屬性中。 然后您為該類型的對象編寫一個比較器並應用該比較器。

比較器類的示例:

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

你可以簡單地這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM