vascon21

Тестовое задание (Васильев Константин)

Jun 16th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.85 KB | None | 0 0
  1. static string MostFrequentTriplet(string str, CancellationToken ct)
  2. {
  3.     /*для тестов
  4.     Stopwatch sw = new Stopwatch();
  5.     sw.Start();
  6.     для тестов*/
  7.  
  8.     //коллекция, где будет хранится информация обо всех найденных триплетах и их количестве
  9.     Dictionary<string, int> triplets = new Dictionary<string, int>();
  10.     //данная строка, разделённая на слова
  11.     String[] SplittedStr = str.Split(',');
  12.     //первый параллельный цикл, который движется по словам из массива SplittedStr
  13.     Parallel.ForEach(SplittedStr, (s) =>
  14.     {
  15.         //второй параллельный цикл, который движется по буквам из слов массмва SplittedStr (до 3 с конца буквы в каждом слове, т.к. необходимо извлечение только триплетов)
  16.         Parallel.For(0, s.Length - 2, (i) =>
  17.         {
  18.             //выделение триплетов
  19.             string SubStr = s.Substring(i, 3);
  20.             //инкрементирование позиции Value, соответсвуещего Key. если текущий триплен не уникален
  21.             if (triplets.ContainsKey(SubStr))
  22.             {
  23.                 triplets[SubStr]++;
  24.             }
  25.             //добавление триплета в коллекцию, если он уникальный
  26.             else
  27.             {
  28.                 triplets[SubStr] = 1;
  29.             }
  30.             //проверка на отмену операции
  31.             ct.ThrowIfCancellationRequested();
  32.         });
  33.         //проверка на отмену операции
  34.         ct.ThrowIfCancellationRequested();
  35.     });
  36.  
  37.     //максимальное количество триплетов
  38.     int MaxQuantity = triplets.Max(it => it.Value);
  39.     //строка для вывода
  40.     string result = "";
  41.     //третий параллельный цикл для выбора максимальных Value и добавления в result соответствующих полей
  42.     Parallel.ForEach(triplets, (i) =>
  43.     {
  44.         if (i.Value == MaxQuantity)
  45.         {
  46.             if (result != "") result += ",";
  47.             result += i.Key;
  48.         }
  49.         //проверка на отмену операции
  50.         ct.ThrowIfCancellationRequested();
  51.     });
  52.     result += "\t" + MaxQuantity.ToString();
  53.  
  54.     /*для тестов
  55.     Console.WriteLine(String.Join(Environment.NewLine,
  56.     triplets.OrderByDescending(it => it.Value).Select(it => it.Key + ": " + it.Value)));
  57.     sw.Stop();
  58.     Console.WriteLine("Time:" + (sw.ElapsedMilliseconds).ToString());
  59.     для тестов */
  60.  
  61.     return result;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment