C# :: Aufgabe #330

2 Lösungen Lösungen öffentlich

Ranking von Punktzahlen

Anfänger - C# von JKooP - 04.10.2020 um 13:02 Uhr
Bei einer Sportveranstaltung wurden die erreichten Punkte in eine Punkteliste überführt.
Jetzt gilt es herauszufinden, wer die meisten und wer die wenigsten Punkte in der Liste hat, um daraus ein sogenanntes Ranking zu erstellen.

Punkteliste = [14, 11, 19, 7, 14, 8, 5]

Ranking1 = [2, 3, 1, 5, 2, 4, 6]

Da es bei Sportveranstaltungen bei Vergabe von zwei 2. Plätzen oft keinen 3. Platz gibt, sähe so ein Ranking folgendermaßen aus:

Ranking2 = [2, 4, 1, 6, 2, 5, 7]

Schreibe eine Methode/Funktion, die sowohl das 1. als auch das 2. Ranking ausgibt.

Viel Spaß

Lösungen:

vote_ok
von Waldgeist (1930 Punkte) - 14.10.2020 um 13:03 Uhr
Hallo,

habe mir mal eine Lösung gebastelt. Ich hoffe ich habe die Aufgabe richtig interpretiert.

Grüße
Waldgeist

Quellcode ausblenden C#-Code
 using System;
using System.Collections.Generic;
using System.Linq;

namespace Aufgabe_330_Ranking
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            
            List<int> numbers = new List<int>() { 14, 11, 19, 7, 14, 8, 5 };

            List<int> sortedNumbers = numbers.OrderByDescending(number => number).ToList();

            for (int i = 0; i < sortedNumbers.Count; i++)
            {
                Console.WriteLine($"Platz-Nr {i + 1} mit {sortedNumbers[i]} Punkten");
            }

            Console.WriteLine();

            List<int> sortedNumbers2 = numbers.OrderByDescending(number => number).ToList();

            

            for (int i = 0; i < sortedNumbers2.Count; i++)
            {
                if (i == 0)
                {
                    Console.WriteLine($"Platz-Nr {i + 1} mit {sortedNumbers2[i]} Punkten");
                }
                else if (!(sortedNumbers2[i] == sortedNumbers2[i - 1]))
                {
                    Console.WriteLine($"Platz-Nr {i + 1} mit {sortedNumbers2[i]} Punkten");
                }
                else
                {
                    Console.WriteLine($"Platz-Nr {i} mit {sortedNumbers2[i]} Punkten");
                }
            }
        }
    }
}
vote_ok
von JKooP (7540 Punkte) - 03.01.2021 um 11:19 Uhr
NET Core 3.x; C# 8.x
Lösung 2 & weitere mögliche Ausgaben:
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

namespace CS_MDL_CORE_Ranking
{
    class Program
    {
        static void Main(string[] args)
        {
            var l = new List<int>() { 14, 11, 19, 7, 14, 8, 5 };
            PrintList(l);
            PrintRanking(l);
            Console.WriteLine();
            PrintRankingTuple(l);
            Console.WriteLine();
            PrintRankingList(l);
            Console.WriteLine();
            PrintRankingOrderedList(l);
        }
        static void PrintList(IEnumerable<int> l) => Console.Write($"[{ string.Join(", ", l) }] -> ");

        static void PrintRanking(IEnumerable<int> l) => Console.WriteLine($"[{ string.Join(", ", l.Select(x => new { r = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).Select(x => x.r))}]");

        static void PrintRankingTuple(IEnumerable<int> l) => l.Select(x => new { n = x, r = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).Select(x => (x.n, x.r)).ToList().ForEach(x => Console.WriteLine(x));

        static void PrintRankingList(IEnumerable<int> l) => l.Select(x => new { points = x, rank = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).ToList().ForEach(x => Console.WriteLine(x));

        static void PrintRankingOrderedList(IEnumerable<int> l) => l.Select(x => new { points = x, rank = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).ToList().OrderBy(x => x.rank).ToList().ForEach(x => Console.WriteLine(x));
    }
}