Убрать лишние пробелы из строки с максимальной скоростью - C#

Узнай цену своей работы

Формулировка задачи:

Имеем строку:
Листинг программы
  1. string line = " Мама мыла раму ";
Нужно максимально быстро убрать пробелы в начале и конце строки, а внутри оставить только по одному пробелу между словами. Я попробовал два варианта: с помощью регулярного выражения и с помощью посимвольного перебора строки и склейки в StringBuilder. В первом случае время 6,5 секунд (на 5 млн. строк), во втором случае время 3,6 секунд (на 5 млн. строк). Как думаете, можно ли еще быстрее сделать эту операцию? Код теста приложен:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text.RegularExpressions;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace test
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. Regex reSpaces = new Regex(" {2,}", RegexOptions.Compiled);
  19. DateTime start = DateTime.Now;
  20. string line = " Мама мыла раму ";
  21. string result = null;
  22. for (int i = 0; i < 5000000; i++)
  23. {
  24. //1. С помошью регулярного выражения + Trim = 6,5 секунд
  25. //result = reSpaces.Replace(line, " ");
  26. //result = result.TrimEnd().TrimStart();
  27. //2. С помощью разделение строки и обратной склейки = 3,6 секунд
  28. result = CompactWhitespaces(line);
  29. }
  30. DateTime end = DateTime.Now;
  31. MessageBox.Show(result);
  32. MessageBox.Show((end - start).TotalSeconds.ToString());
  33. }
  34.  
  35. public static String CompactWhitespaces(String s)
  36. {
  37. StringBuilder sb = new StringBuilder(s);
  38. CompactWhitespaces(sb);
  39. return sb.ToString();
  40. }
  41. public static void CompactWhitespaces(StringBuilder sb)
  42. {
  43. if (sb.Length == 0)
  44. return;
  45. int start = 0;
  46. while (start < sb.Length)
  47. {
  48. if (Char.IsWhiteSpace(sb[start]))
  49. start++;
  50. else
  51. break;
  52. }
  53. if (start == sb.Length)
  54. {
  55. sb.Length = 0;
  56. return;
  57. }
  58. int end = sb.Length - 1;
  59. while (end >= 0)
  60. {
  61. if (Char.IsWhiteSpace(sb[end]))
  62. end--;
  63. else
  64. break;
  65. }
  66. int dest = 0;
  67. bool previousIsWhitespace = false;
  68. for (int i = start; i <= end; i++)
  69. {
  70. if (Char.IsWhiteSpace(sb[i]))
  71. {
  72. if (!previousIsWhitespace)
  73. {
  74. previousIsWhitespace = true;
  75. sb[dest] = ' ';
  76. dest++;
  77. }
  78. }
  79. else
  80. {
  81. previousIsWhitespace = false;
  82. sb[dest] = sb[i];
  83. dest++;
  84. }
  85. }
  86. sb.Length = dest;
  87. }
  88. }
  89. }

Решение задачи: «Убрать лишние пробелы из строки с максимальной скоростью»

textual
Листинг программы
  1. FUNC = Suppir RESULT = 00:00:02.7561602
  2. FUNC = cws RESULT = 00:00:00.6289758
  3. FUNC = Psylon RESULT = 00:00:00.7196369
  4. FUNC = FastCompactWhitespaces RESULT = 00:00:00.7681129

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы