অন্যান্য মন্তব্যগুলি বিচার করে, এটি করার কোনও আদর্শ দ্রুত উপায় নেই। স্ট্রিংবিল্ডারগুলি .Insert(0, "text")
ব্যবহার করা বেদনাদায়কভাবে ধীরে ধীরে স্ট্রিং কনটেনটেশন (> 10000 কনক্যাটসের ভিত্তিতে) ব্যবহার করার মতো প্রায় দ্রুত মাত্র ১-৩xx, তাই সম্ভবত কয়েক হাজার গুণ দ্রুত তাত্পর্যপূর্ণ করার জন্য নীচে একটি বর্গ রয়েছে!
আমি যেমন কিছু অন্যান্য প্রাথমিক কার্যকারিতা অন্তর্ভুক্ত করেছি append()
, subString()
এবং length()
ইত্যাদি উভয় আপনার স্বাক্ষরে এবং prepends ধীর চেয়ে StringBuilder appends 3x সম্পর্কে দুইবার হিসাবে দ্রুত থেকে পরিবর্তিত হয়। স্ট্রিংবিল্ডারের মতো, পাঠ্যটি পুরানো বাফার আকারটি উপচে পড়লে এই শ্রেণীর বাফারটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে।
কোডটি বেশ অনেকগুলি পরীক্ষিত হয়েছে, তবে আমি এটি কোনও বাগ ছাড়াই গ্যারান্টি দিতে পারি না।
class Prepender
{
private char[] c;
private int growMultiplier;
public int bufferSize; // Make public for bug testing
public int left; // Make public for bug testing
public int right; // Make public for bug testing
public Prepender(int initialBuffer = 1000, int growMultiplier = 10)
{
c = new char[initialBuffer];
//for (int n = 0; n < initialBuffer; n++) cc[n] = '.'; // For debugging purposes (used fixed width font for testing)
left = initialBuffer / 2;
right = initialBuffer / 2;
bufferSize = initialBuffer;
this.growMultiplier = growMultiplier;
}
public void clear()
{
left = bufferSize / 2;
right = bufferSize / 2;
}
public int length()
{
return right - left;
}
private void increaseBuffer()
{
int nudge = -bufferSize / 2;
bufferSize *= growMultiplier;
nudge += bufferSize / 2;
char[] tmp = new char[bufferSize];
for (int n = left; n < right; n++) tmp[n + nudge] = c[n];
left += nudge;
right += nudge;
c = new char[bufferSize];
//for (int n = 0; n < buffer; n++) cc[n]='.'; // For debugging purposes (used fixed width font for testing)
for (int n = left; n < right; n++) c[n] = tmp[n];
}
public void append(string s)
{
// If necessary, increase buffer size by growMultiplier
while (right + s.Length > bufferSize) increaseBuffer();
// Append user input to buffer
int len = s.Length;
for (int n = 0; n < len; n++)
{
c[right] = s[n];
right++;
}
}
public void prepend(string s)
{
// If necessary, increase buffer size by growMultiplier
while (left - s.Length < 0) increaseBuffer();
// Prepend user input to buffer
int len = s.Length - 1;
for (int n = len; n > -1; n--)
{
left--;
c[left] = s[n];
}
}
public void truncate(int start, int finish)
{
if (start < 0) throw new Exception("Truncation error: Start < 0");
if (left + finish > right) throw new Exception("Truncation error: Finish > string length");
if (finish < start) throw new Exception("Truncation error: Finish < start");
//MessageBox.Show(left + " " + right);
right = left + finish;
left = left + start;
}
public string subString(int start, int finish)
{
if (start < 0) throw new Exception("Substring error: Start < 0");
if (left + finish > right) throw new Exception("Substring error: Finish > string length");
if (finish < start) throw new Exception("Substring error: Finish < start");
return toString(start,finish);
}
public override string ToString()
{
return new string(c, left, right - left);
//return new string(cc, 0, buffer); // For debugging purposes (used fixed width font for testing)
}
private string toString(int start, int finish)
{
return new string(c, left+start, finish-start );
//return new string(cc, 0, buffer); // For debugging purposes (used fixed width font for testing)
}
}