Loading...
Ankoun1 avatar Ankoun1 18 Точки

поправителен изпит - 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}");
                    }
                } 
               
            }
        }
    }
}

Тагове:
0
Fundamentals Module 16/08/2020 17:51:07
nickwork avatar nickwork 657 Точки

Дай някакво условие да видим каква трябва да е сортировката, ако само там ти е проблема няма да отнеме мн време

0
Ankoun1 avatar Ankoun1 18 Точки

задание за сортировка:

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

0
nickwork avatar nickwork 657 Точки

Разгледах то решението, като цяло структурата която си избрал за работа не е много ок, проблема идва от там, че в твоята програма основното са самите piece, след това автора и на края групата, към която се отнасят, съответно piece-овете трябва да са ти ключовете на колекцията, а не самата стойност...и то вложена максимало на вътре в структурата на вложеният речник. Сортировка предполагам, че може да се измисли и така, няма невъзможни неща, но не виждам смисъл да се прави...(даже не си бий главата да търсиш нещо за сортиране на вложени речници...в практиката едва ли ще ти потрябва - именно за това има ООП - всичко се прави с класове и става 1000 пъти по лесно).

Като съвет по добре си пренареди структурата така както описах по гореи всичко ще стане по лесно + никога не слагай основният елемент за сортиране максимално на вътре, ако се получи така, значи начина който си избрал е грешен...

0
Ankoun1 avatar Ankoun1 18 Точки

според мен  по -правилното структорирано  условие е произведенията да са подредени в списък по автори ,а не авторите в списък по произведения ,защото така няма да има повторения на авторите,все пак трябва да се тества в системата.дали не може да се ревърсне тази подредба накрая

0
17/08/2020 13:55:40
Ankoun1 avatar Ankoun1 18 Точки

не става с тази сортировка ,това което трябва да се сортира първо се намира в края на речника в листовете

0
16/08/2020 20:32:52
Angmar avatar Angmar 1 Точки

До колкото си спомням в задача искаха да се подреди по Име на произведението и после по Име на композитора. При твоята структура на речника се получава малко объркване. Трябва да си структурираш данните по следния начин;

1 - Име на произведението (Piece), което ще играе роля на Key за Dictionary-то. (което е стринг както си го написал в кода))

За Value към този ключ, слагаш или речник или масив[2], лично смятам, че вложения речник само усложнява нещата. На упражненията ни го показаха за да видим как работи но според мен в подобна задача е ненужно.

2 - Тук според мен си слагаш един масив[2] - {ключ, автор }

Тогава сортировката би изглеждала така

var ordered = listOfPianoProducers.Orderby(x => x.Key).Thenby(x => x.Value[1]);

Тоест първо подреждаш по име на произведението в случая Key за речника

После по Value[1], дефакто ти е името на Композитора (индекс 1 на масива, който е Value)

А иначе както е писал nickwork, тия задачи са супер лесни с класове и обекти, след час два ще се опитем да ти изпратя такова решение.

0
vicksun avatar vicksun 21 Точки

Абсолютно съм съгласен с колегата - няма нужда да си усложняваш живота с вложен речник. Вложен масив или лист върши идеална работа за тази задача, а и сортировката му е много по- лесна. 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.