Bu soru, diğer afişlerin ortaya koyduğu kadar basit değil (ve aslında olduğuna inandığım gibi) - çünkü soru olması gerektiği kadar kesin değil.
"Boşluk" ve "boşluk" arasında bir fark vardır. Eğer varsa sadece boşluk anlamına, o zaman bir düzenli ifade kullanmalıdır " {2,}". Herhangi bir boşluktan bahsediyorsanız, bu farklı bir konudur. Should tüm boşluk alanlara dönüştürülebilir? Başlangıçta ve sonda uzaya ne olmalı?
Aşağıdaki kıyaslama için, yalnızca boşlukları önemsediğinizi ve başlangıçta ve sonda bile tek boşluklara hiçbir şey yapmak istemediğinizi varsaydım.
Doğruluğun neredeyse her zaman performanstan daha önemli olduğunu unutmayın. Split / Join çözümünün baştaki / sondaki beyaz boşlukları (tek boşluklar bile) kaldırması gerçeği, belirtilen gereksinimlerinize göre yanlıştır (tabii ki eksik olabilir).
Kıyaslama MiniBench kullanıyor .
using System;
using System.Text.RegularExpressions;
using MiniBench;
internal class Program
{
public static void Main(string[] args)
{
int size = int.Parse(args[0]);
int gapBetweenExtraSpaces = int.Parse(args[1]);
char[] chars = new char[size];
for (int i=0; i < size/2; i += 2)
{
// Make sure there actually *is* something to do
chars[i*2] = (i % gapBetweenExtraSpaces == 1) ? ' ' : 'x';
chars[i*2 + 1] = ' ';
}
// Just to make sure we don't have a \0 at the end
// for odd sizes
chars[chars.Length-1] = 'y';
string bigString = new string(chars);
// Assume that one form works :)
string normalized = NormalizeWithSplitAndJoin(bigString);
var suite = new TestSuite<string, string>("Normalize")
.Plus(NormalizeWithSplitAndJoin)
.Plus(NormalizeWithRegex)
.RunTests(bigString, normalized);
suite.Display(ResultColumns.All, suite.FindBest());
}
private static readonly Regex MultipleSpaces =
new Regex(@" {2,}", RegexOptions.Compiled);
static string NormalizeWithRegex(string input)
{
return MultipleSpaces.Replace(input, " ");
}
// Guessing as the post doesn't specify what to use
private static readonly char[] Whitespace =
new char[] { ' ' };
static string NormalizeWithSplitAndJoin(string input)
{
string[] split = input.Split
(Whitespace, StringSplitOptions.RemoveEmptyEntries);
return string.Join(" ", split);
}
}
Birkaç test çalışması:
c:\Users\Jon\Test>test 1000 50
============ Normalize ============
NormalizeWithSplitAndJoin 1159091 0:30.258 22.93
NormalizeWithRegex 26378882 0:30.025 1.00
c:\Users\Jon\Test>test 1000 5
============ Normalize ============
NormalizeWithSplitAndJoin 947540 0:30.013 1.07
NormalizeWithRegex 1003862 0:29.610 1.00
c:\Users\Jon\Test>test 1000 1001
============ Normalize ============
NormalizeWithSplitAndJoin 1156299 0:29.898 21.99
NormalizeWithRegex 23243802 0:27.335 1.00
Buradaki ilk sayı yineleme sayısı, ikincisi geçen süre ve üçüncüsü 1.0 en iyi olan ölçeklendirilmiş bir puandır.
Yani gösterileri ki en azından (bu dahil) bazı durumlarda normal bir ifade olabilir Böl daha iyi performans / çok önemli bir farkla bazen çözüm katılın.
Ancak, bir "tüm boşluk" gereksinimine geçerseniz, Böl / Birleştir kazanmış gibi görünür. Çoğu zaman olduğu gibi, şeytan ayrıntıda gizlidir ...