diff --git a/Highscore/HighscoreProcessing.cs b/Highscore/HighscoreProcessing.cs
index 2db2d91..d0259b4 100644
--- a/Highscore/HighscoreProcessing.cs
+++ b/Highscore/HighscoreProcessing.cs
@@ -26,7 +26,13 @@ public static class HighscoreProcessing
/// Path to write to
public static void WriteOutputFileAndPrint(GameScore[] highscore, string filePath)
{
- // TODO
+ string[] lines = new string[highscore.Length + 1];
+ lines[0] = "Score;Date;Player";
+ for (int i = 0; i < highscore.Length; i++)
+ {
+ lines[i + 1] = $"{highscore[i].Score};{highscore[i].Date:dd.MM.yyyy};{highscore[i].Player.NickName} (#{highscore[i].Player.Id})";
+ }
+ File.WriteAllLines(filePath, lines);
}
///
@@ -37,8 +43,36 @@ public static class HighscoreProcessing
/// Array of parsed items; empty array if file does not exist or is empty
public static GameScore[] LoadScoresFromFile(string filePath)
{
- // TODO
- return [];
+ if (!Path.Exists(filePath))
+ {
+ return Array.Empty();
+ }
+
+ string[] loadedScores = File.ReadAllLines(filePath);
+ if (loadedScores.Length <= 1)
+ {
+ return Array.Empty();
+ }
+ loadedScores = loadedScores[1..];
+ GameScore?[] gameScores = new GameScore[loadedScores.Length];
+ for (int i = 0; i < loadedScores.Length; i++)
+ {
+ if (TryParseGameScore(loadedScores[i], out GameScore? gameScore))
+ {
+ if(gameScore!.Player.Id < 0 || gameScore.Score < 0)
+ {
+ gameScores[i] = null;
+ continue;
+ }
+ gameScores[i] = gameScore!;
+ }
+ else
+ {
+ gameScores[i] = null;
+ }
+ }
+
+ return TrimArray(gameScores);
}
///
@@ -49,9 +83,26 @@ public static class HighscoreProcessing
/// True if parsed successfully; false otherwise
public static bool TryParseGameScore(string line, out GameScore? gameScore)
{
- // TODO
gameScore = null;
- return false;
+
+ string[] parts = line.Split(Separator);
+ if (parts.Length != 4)
+ {
+ return false;
+ }
+
+ if (!int.TryParse(parts[0], out int id) || !DateTime.TryParse(parts[2], out DateTime date) ||
+ !int.TryParse(parts[3], out int score))
+ {
+ return false;
+ }
+ if(parts[1] == string.Empty || score < 0)
+ {
+ return false;
+ }
+
+ gameScore = new GameScore(new Player(id, parts[1]), score, date);
+ return true;
}
///
@@ -63,8 +114,35 @@ public static class HighscoreProcessing
/// An array containing the highest score of each user, based on passed scores
public static GameScore[] FindBestScorePerUser(GameScore[] allScores)
{
- // TODO
- return [];
+ GameScore[] sortedScored = allScores;
+ SortGameScores(sortedScored);
+ sortedScored = TrimScorePerUser(sortedScored);
+ return sortedScored;
+ }
+
+ private static GameScore[] TrimScorePerUser(GameScore?[] scores)
+ {
+ for (int i = 0; i < scores.Length; i++)
+ {
+ for (int j = 0; j < scores.Length; j++)
+ {
+ if (scores[i]?.Player.Id == scores[j]?.Player.Id && i != j)
+ {
+ if(scores[i] == null || scores[j] == null)
+ {
+ continue;
+ }
+ if (scores[i]!.Score < scores[j]!.Score ||
+ (scores[i]!.Score == scores[j]!.Score && scores[i]!.Date > scores[j]!.Date))
+ {
+ (scores[i], scores[j]) = (scores[j], scores[i]);
+ }
+ scores[j] = null;
+ }
+ }
+ }
+
+ return TrimArray(scores);
}
///
@@ -75,7 +153,20 @@ public static class HighscoreProcessing
/// Scores to sort
public static void SortGameScores(GameScore[] scores)
{
- // TODO
+ for (int i = 0; i < scores.Length; i++)
+ {
+ for (int j = i + 1; j < scores.Length; j++)
+ {
+ if (scores[i].Score < scores[j].Score)
+ {
+ (scores[i], scores[j]) = (scores[j], scores[i]);
+ }
+ else if (scores[i].Score == scores[j].Score && scores[i].Date > scores[j].Date)
+ {
+ (scores[i], scores[j]) = (scores[j], scores[i]);
+ }
+ }
+ }
}
///
@@ -85,7 +176,32 @@ public static class HighscoreProcessing
/// A new array containing only the non-null entries from the passed array
public static GameScore[] TrimArray(GameScore?[] arrayToTrim)
{
- // TODO
- return [];
+ if (arrayToTrim.Length == 0)
+ {
+ return Array.Empty();
+ }
+ int index = 0;
+ foreach (var VARIABLE in arrayToTrim)
+ {
+ if (VARIABLE != null)
+ {
+ index++;
+ }
+ }
+ if (index == 0)
+ {
+ return Array.Empty();
+ }
+
+ var trimmedArray = new GameScore[index];
+ index = 0;
+ for (int i = 0; i < arrayToTrim.Length; i++)
+ {
+ if (arrayToTrim[i] != null)
+ {
+ trimmedArray[index++] = arrayToTrim[i]!;
+ }
+ }
+ return trimmedArray;
}
}
\ No newline at end of file