mardi 26 novembre 2024

Implementer public static List MergeData(List dataStrings)

 en c# vos donnees sont organisees en une liste de chaine de caratere. Chaune d'entre elles correspond a une seule personne et est organisee en paires clé/valeur. un exemple: Name = John, Age=15;Likes=Apples; et Name=Marry; Age=16;Likes=Baked potatoes;Team=Basketball; Vous avez certaines garanties sur les donnees d'entree: Chaque chaine contiendra toujours le champ Name; chque personne peut etre identifiee de maniere unique par le champ Name, s'il y a plusieurs lignes avec le meme valeur de Name, celles ci concernent toutes la meme personne; il peut y avoir des informations redondantes entre les chaine ou meme a l'interieur d'une seule chaine, mais elles ne se contrediront jamais; Les cles et les valeurs peuvent contenir n'importe quel caratere ASCII imprimable, à l'exception de = et de ; , qui sont utilises comme separateurs; Les chaines ne contiennent pas de saut de ligne \r ou\n. Fusionner les donnees et produire une liste regroupant toutes les informations relatives à chaque personne . Ces donnee etre formatee de la maniere suisvante: Toutes les personnes sont triees lexicographiquement par leur champ Name; Le premier champ pour chaque personne est Name, puis tous les autre champs sont tries par leur cle. Contraintes: il y aura au plus 100 chaines de carateres dans la liste; chaque chaine a une longeur max de 10000 caracteres; chaque chaine en sortie aura egalement une longeur max de 10000 carateres; il n'y a pas de champ vide, ni de cle vide, ni de valeur vide. Implementer : /** * @param dataStrings [[anArray]] de chaînes de caractères, où chaque chaîne représente une personne. * @return [[anArray]] de chaînes de caractères, les données d'entrée fusionnées. */ public static List<string> MergeData(List<string> dataStrings)

Étapes de la solution

  1. Analyse des chaînes d'entrée :

    • Parse chaque chaîne pour extraire les paires clé/valeur.
    • Grouper les informations par le champ Name.
  2. Fusionner les informations :

    • Pour chaque personne (identifiée par Name), fusionner toutes ses informations dans un dictionnaire.
  3. Trier et formater les résultats :

    • Trier les personnes par leur Name dans l'ordre lexicographique.
    • Pour chaque personne, trier ses champs (sauf Name, qui est toujours en premier).
    • Formater chaque entrée dans le format requis.
  4. Renvoyer les résultats :

    • Retourner la liste des chaînes regroupées et formatées.

Points importants

  1. Complexité :

    • Parsing des chaînes : O(nm)O(n \cdot m), où nn est le nombre de chaînes et mm est leur longueur moyenne.
    • Tri et fusion : O(nlogn+klogk)O(n \log n + k \log k), où kk est le nombre moyen de champs par personne.
  2. Manipulation des chaînes :

    • Assurez-vous que les clés et les valeurs ne contiennent pas de caractères réservés (= ou ;).
  3. Gestion des données volumineuses :

    • Bien que chaque chaîne puisse être longue, les structures comme Dictionary et SortedDictionary sont adaptées pour gérer efficacement les données fusionnées.

C#: 

public static List<string> MergeData(List<string> dataStrings) {
        // Write your code here
        // To debug: Console.Error.WriteLine("Debug messages...");
        var peopleData = new Dictionary<string, SortedDictionary<string, string>>();
        foreach(string dataS in dataStrings){
            var fields = dataS.Split(';');
            string name = null;
            var currentData = new Dictionary<string, string>();

            foreach(string field in fields){
                var keyValue = field.Split('=');
                string key = keyValue[0].Trim();
                string value = keyValue[1].Trim();

                if(key == "Name"){
                    name = value;
                }

                currentData[key] = value;
            }

            if(name != null){
                if (!peopleData.ContainsKey(name))
                {
                    peopleData[name] = new SortedDictionary<string, string>();
                }

                foreach(var kvp in currentData){
                    peopleData[name][kvp.Key] = kvp.Value;
                }
            }
        }

        var result = new List<string>();
        foreach(var person in peopleData.OrderBy(p=>p.Key)){
            var formattedData = new List<string>();
            formattedData.Add($"Name={person.Key}");

            foreach (var kvp in person.Value.OrderBy(k => k.Key))
            {
                if (kvp.Key != "Name")
                {
                    formattedData.Add($"{kvp.Key}={kvp.Value}");
                }
            }

            result.Add(string.Join(";", formattedData));
        }


        return result;
    }

Aucun commentaire:

Enregistrer un commentaire