поправителен изпит - 3 зад.
имате ли идея как да сортирам финалния вложен речник?
using System;
using System.Collections.Generic;
using System.Linq;
namespace exampr
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Dictionary<string,Dictionary<string,List<string>>> listOfPianoProducers = new Dictionary<string,Dictionary<string,List<string>>>();
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine().Split('|').ToArray();
string key = input[2];
string composer = input[1];
string piece = input[0];
List<string> pieces = new List<string>();
pieces.Add(piece);
Dictionary<string, List<string>> autthorPiece = new Dictionary<string, List<string>>();
autthorPiece.Add(composer, pieces);
if (listOfPianoProducers.ContainsKey(key))
{
if (listOfPianoProducers[key].ContainsKey(composer))
{
if(!listOfPianoProducers[key][composer].Contains(piece))
{
listOfPianoProducers[key][composer].Add(piece);
}
}
else
{
listOfPianoProducers[key].Add(composer,pieces);
}
}
else
{
listOfPianoProducers.Add(key,autthorPiece);
}
}
Console.WriteLine(listOfPianoProducers.Count);
while (true)
{
string input = Console.ReadLine();
if(input == "Stop")
{
break;
}
string[] command = input.Split('|').ToArray();
if (command[0] == "Add")
{
string piece = command[1];
string composer = command[2];
string key = command[3];
Console.WriteLine(1);
bool count = false;
foreach(var item in listOfPianoProducers)
{
foreach(var name in item.Value)
{
if (name.Value.Contains(piece))
{
Console.WriteLine($"{piece} is already in the collection!");
count = true;
}
}
}
if (!count)
{
if (listOfPianoProducers.ContainsKey(key))
{
if (listOfPianoProducers[key].ContainsKey(composer))
{
listOfPianoProducers[key][composer].Add(piece);
}
else
{
listOfPianoProducers[key].Add(composer, new List<string> { piece });
}
}
else
{
List<string> pieces = new List<string>();
pieces.Add(piece);
Dictionary<string, List<string>> autthorPiece = new Dictionary<string, List<string>>();
autthorPiece.Add(composer, pieces);
listOfPianoProducers.Add(key, autthorPiece);
}
Console.WriteLine($"{piece} by {composer} in {key} added to the collection!");
}
}else if(command[0] == "Remove")
{
string piece = command[1];
bool count = false;
foreach (var item in listOfPianoProducers)
{
foreach (var name in item.Value)
{
if (name.Value.Contains(piece))
{
name.Value.Remove(piece);
count = true;
}
}
}
if (count)
{
Console.WriteLine($"Successfully removed {piece}!");
}
else
{
Console.WriteLine($"Invalid operation! {piece} does not exist in the collection.");
}
}
else
{
string piece = command[1];
string key = command[2];
string oldKey = "";
string oldComposer = "";
bool count = false;
foreach (var item in listOfPianoProducers)
{
foreach (var name in item.Value)
{
if (name.Value.Contains(piece))
{
name.Value.Remove(piece);
count = true;
oldKey = item.Key;
oldComposer = name.Key;
}
}
}
if (count)
{
//listOfPianoProducers.Remove(oldKey);
Dictionary<string, List<string>> autthorPiece = new Dictionary<string, List<string>>();
autthorPiece.Add(oldComposer, new List<string> { piece });
listOfPianoProducers.Add(key,autthorPiece);
Console.WriteLine($"Changed the key of {piece} to {key}!");
}
else
{
Console.WriteLine($"Invalid operation! {piece} does not exist in the collection.");
}
}
}
Console.WriteLine(listOfPianoProducers.Count);
foreach(var item in listOfPianoProducers)
{
foreach(var item1 in item.Value)
{
foreach (var item2 in item1.Value)
{
Console.WriteLine($"{item2} -> Composer: {item1.Key}, Key: {item.Key}");
}
}
}
}
}
}
задание за сортировка:
Upon receiving the "Stop" command you need to print all pieces in your collection, sorted by their name and by the name of their composer in alphabetical order, in the following format:
"{Piece} -> Composer: {composer}, Key: {key}"
вход и изход:
3
Fur Elise|Beethoven|A Minor
Moonlight Sonata|Beethoven|C# Minor
Clair de Lune|Debussy|C# Minor
Add|Sonata No.2|Chopin|B Minor
Add|Hungarian Rhapsody No.2|Liszt|C# Minor
Add|Fur Elise|Beethoven|C# Minor
Remove|Clair de Lune
ChangeKey|Moonlight Sonata|C# Major
Stop
Sonata No.2 by Chopin in B Minor added to the collection!
Hungarian Rhapsody No.2 by Liszt in C# Minor added to the collection!
Fur Elise is already in the collection!
Successfully removed Clair de Lune!
Changed the key of Moonlight Sonata to C# Major!
Fur Elise -> Composer: Beethoven, Key: A Minor
Hungarian Rhapsody No.2 -> Composer: Liszt, Key: C# Minor
Moonlight Sonata -> Composer: Beethoven, Key: C# Major
Sonata No.2 -> Composer: Chopin, Key: B Minor
Разгледах то решението, като цяло структурата която си избрал за работа не е много ок, проблема идва от там, че в твоята програма основното са самите piece, след това автора и на края групата, към която се отнасят, съответно piece-овете трябва да са ти ключовете на колекцията, а не самата стойност...и то вложена максимало на вътре в структурата на вложеният речник. Сортировка предполагам, че може да се измисли и така, няма невъзможни неща, но не виждам смисъл да се прави...(даже не си бий главата да търсиш нещо за сортиране на вложени речници...в практиката едва ли ще ти потрябва - именно за това има ООП - всичко се прави с класове и става 1000 пъти по лесно).
Като съвет по добре си пренареди структурата така както описах по гореи всичко ще стане по лесно + никога не слагай основният елемент за сортиране максимално на вътре, ако се получи така, значи начина който си избрал е грешен...
според мен по -правилното структорирано условие е произведенията да са подредени в списък по автори ,а не авторите в списък по произведения ,защото така няма да има повторения на авторите,все пак трябва да се тества в системата.дали не може да се ревърсне тази подредба накрая