Burada birçok cevap var ve hepsi iki yönteme dayanıyor:
- YÖNTEM1: dizeyi iki alt dize kullanarak böl ve aradaki karakteri doldur
- YÖNTEM2: dizeyi karakter dizisine dönüştür, bir dizi üyesini değiştir ve ona katıl
Şahsen, bu iki yöntemi farklı durumlarda kullanırdım. Açıklamama izin ver.
@FabioPhms: Metodunuz başlangıçta kullandığım yöntemdi ve çok sayıda karakter içeren dizede kötü olduğundan korkuyordum. Ancak, soru çok karakter nedir? Ben 10 "lorem ipsum" paragraflarda test ve birkaç milisaniye sürdü. Sonra 10 kat daha büyük bir dizede test ettim - gerçekten büyük bir fark yoktu. Hm.
@vsync, @Cory Mawhorter: Yorumlarınız açık; Ancak, yine, büyük bir dize nedir? 32 ... 100kb performans için daha iyi olmalı ve karakter değiştirme işleminin bu alt dizisi için bir alt dize varyantı kullanması gerektiğini kabul ediyorum.
Ama birkaç değişiklik yapmam gerekirse ne olacak?
Bu durumda neyin daha hızlı olduğunu kanıtlamak için kendi testlerimi yapmam gerekiyordu. Diyelim ki 1000 karakterden oluşan nispeten kısa bir dizeyi işleyecek bir algoritmamız var. Ortalama olarak bu dizgideki her karakterin ~ 100 kez değiştirilmesini bekliyoruz. Yani, böyle bir şeyi test etmek için kod:
var str = "... {A LARGE STRING HERE} ...";
for(var i=0; i<100000; i++)
{
var n = '' + Math.floor(Math.random() * 10);
var p = Math.floor(Math.random() * 1000);
// replace character *n* on position *p*
}
Bunun için bir keman yarattım ve burada . İki test vardır: TEST1 (alt dize) ve TEST2 (dizi dönüşümü).
Sonuçlar:
- TEST1: 195 ms
- TEST2: 6 ms
Dizi dönüşüm alt dizeyi 2 büyüklükte yener gibi görünüyor! Peki - burada ne oldu ???
Gerçekte olan, TEST2'deki tüm işlemlerin, atama ifadesi gibi dizinin kendisinde yapılmasıdır strarr2[p] = n
. Atama, büyük bir dizgideki alt dizeye kıyasla gerçekten hızlıdır ve kazanacağı açıktır.
Yani, iş için doğru aracı seçmekle ilgili. Tekrar.
str[0] = 'x'
, herhangi bir hata atmıyor gibi görünüyor, ancak istenen etkiye sahip değil!