[英]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.