সি # বা জাভা: স্ট্রিংবুডার দিয়ে স্ট্রিং প্রস্তুত করবেন?


102

আমি জানি আমরা ব্যবহার করে স্ট্রিং সংযোজন করতে পারি StringBuilder। এমন কোনও উপায় আছে যা ব্যবহার করে আমরা স্ট্রিংগুলি (যেমন একটি স্ট্রিংয়ের সামনে স্ট্রিংগুলি যুক্ত StringBuilderকরতে পারি ) যুক্ত করতে পারি যাতে আমরা যে পারফরম্যান্সের StringBuilderপ্রস্তাব দিয়ে থাকি তা রাখতে পারি ?


আমি আপনার প্রশ্নটি বুঝতে পারি না
মরিস পেরি

5
শুরুতে যোগ। শব্দটি প্রিপেন্ড হয়। স্ট্রিং প্রিপেন্ড করা অবশ্যই স্ট্রিংয়ের উভয় প্রান্তে একবারে যুক্ত করার মতো কিছু হতে পারে, আমার ধারণা?
জোয়েল মুলার

উত্তর:


164

পজিশন প্যারামিটার 0 তে সেট করে সন্নিবেশ পদ্ধতিটি প্রিপেন্ডিংয়ের সমান হবে (অর্থাত শুরুতে সন্নিবেশ করানো)।

একটি উদাহরণ: varStringBuilder.insert(0, "someThing");

এটি সি # এবং জাভা উভয়ের জন্যই কাজ করে


7
জাভা জন্য স্ট্রিংবিল্ডার sert োকান
ম্যাথু

: প্রাসঙ্গিক API- এর জন্য সঠিক JavaDoc হয় docs.oracle.com/javase/1.5.0/docs/api/java/lang/...
টানা স্লেজগাড়ির

29

স্ট্রিং প্রস্তুতির জন্য সাধারণত কিছুটা ব্যাকিং অ্যারেতে সন্নিবেশ পয়েন্টের পরে সমস্ত কিছু অনুলিপি করা প্রয়োজন, সুতরাং এটি শেষের সাথে সংযোজন করার মতো দ্রুত হবে না।

তবে আপনি এটি জাভাতে এটি করতে পারেন (সি # তে এটি একই, তবে পদ্ধতিটি বলা হয় Insert):

aStringBuilder.insert(0, "newText");

11

যদি আপনার প্রচুর প্রিপেন্ডস সহ উচ্চ পারফরম্যান্সের প্রয়োজন হয় তবে আপনাকে নিজের সংস্করণটি লিখতে হবে StringBuilder(বা অন্য কারো ব্যবহার করতে হবে)। স্ট্যান্ডার্ডের সাথে StringBuilder(যদিও প্রযুক্তিগতভাবে এটি ভিন্নভাবে প্রয়োগ করা যেতে পারে) সন্নিবেশ বিন্দুর পরে তথ্য অনুলিপি করা প্রয়োজন। এন টুকরো টেক্সট োকাতে O (n ^ 2) সময় নিতে পারে।

একটি নির্লজ্জ পদ্ধতির ব্যাকিং char[]বাফারের পাশাপাশি দৈর্ঘ্যের মধ্যে একটি অফসেট যুক্ত করা হবে । যখন একটি প্রিপেন্ডের জন্য পর্যাপ্ত জায়গা না থাকে, তখন ডেটাটিকে কঠোরভাবে প্রয়োজনের চেয়ে বেশি সরিয়ে নিন। এটি পারফরম্যান্সটি ও (এন লগ এন) এর নীচে ফিরিয়ে আনতে পারে (আমার মনে হয়)। একটি আরও পরিশ্রুত পন্থা বাফার চক্র তৈরি করা। এইভাবে অ্যারের উভয় প্রান্তে অতিরিক্ত স্থান স্পষ্ট হয়ে যায়।


5

আপনি একটি এক্সটেনশন পদ্ধতি চেষ্টা করতে পারেন:

/// <summary>
/// kind of a dopey little one-off for StringBuffer, but 
/// an example where you can get crazy with extension methods
/// </summary>
public static void Prepend(this StringBuilder sb, string s)
{
    sb.Insert(0, s);
}

StringBuilder sb = new StringBuilder("World!");
sb.Prepend("Hello "); // Hello World!

5

আপনি বিপরীতে স্ট্রিং তৈরি করতে এবং তারপরে ফলাফলটি বিপরীত করতে পারেন। আপনার নিকটতম ও (এন ^ 2) সবচেয়ে খারাপ কেস ব্যয়ের পরিবর্তে একটি ও (এন) খরচ হয়।


2
এটি কেবলমাত্র যদি আপনি স্বতন্ত্র অক্ষর যুক্ত করে থাকেন তবে কাজ করে। অন্যথায় আপনার যুক্ত প্রতিটি স্ট্রিংয়ের বিপরীত হওয়া দরকার যা স্ট্রিংয়ের আকার এবং সংখ্যার উপর নির্ভর করে যদি সমস্ত সঞ্চয় না হয় তবে সবচেয়ে বেশি পরিমাণে খাওয়া যায়।
স্লেড

4

আমি এটি ব্যবহার করি নি তবে জাভা সাউন্ডের জন্য দৌড়গুলি আকর্ষণীয়। প্রকল্পের নাম, শব্দের উপর একটি খেলা একটি ব্যবহার দড়ি একটি পরিবর্তে স্ট্রিং গুরুতর কাজের জন্য। প্রিপেন্ডিং এবং অন্যান্য ক্রিয়াকলাপগুলির জন্য পারফরম্যান্স পেনাল্টি পেয়ে যায়। এক নজরে মূল্যহীন, যদি আপনি এই কাজটি করতে যাচ্ছেন।

স্ট্রিংসের জন্য একটি দড়ি একটি উচ্চ কার্যকারিতা প্রতিস্থাপন। "দড়ি: একটি বিকল্পের স্ট্রিংস" - এ বিশদে বর্ণিত ডেটাস্ট্রাকচার স্ট্রিং এবং স্ট্রিংবফার উভয়ের চেয়ে প্রাক্পেন্ড, সংযোজন, মোছা এবং সন্নিবেশ করানোর জন্য স্ট্রিং এবং স্ট্রিংবফারের চেয়ে অসম্পূর্ণভাবে উন্নত পারফরম্যান্স সরবরাহ করে। স্ট্রিংয়ের মতো, দড়িগুলি অপরিবর্তনীয় এবং তাই মাল্টি-থ্রেড প্রোগ্রামিংয়ে ব্যবহারের জন্য এটি উপযুক্ত।


4

আপনি জাভা এর স্ট্রিংবিল্ডার ক্লাস ব্যবহার করে प्रीপেন্ড করতে চান তবে আপনি যা করতে পারেন তা এখানে:

StringBuilder str = new StringBuilder();
str.Insert(0, "text");



2

অন্যান্য মন্তব্যগুলি বিচার করে, এটি করার কোনও আদর্শ দ্রুত উপায় নেই। স্ট্রিংবিল্ডারগুলি .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)
    }
}

1

আপনি স্ট্রিংবিল্ডারের জন্য একটি সাধারণ বর্গ দ্বারা নিজেকে একটি এক্সটেনশন তৈরি করতে পারেন:

namespace Application.Code.Helpers
{
    public static class StringBuilderExtensions
    {
        #region Methods

        public static void Prepend(this StringBuilder sb, string value)
        {
            sb.Insert(0, value);
        }

        public static void PrependLine(this StringBuilder sb, string value)
        {
            sb.Insert(0, value + Environment.NewLine);
        }

        #endregion
    }
}

তারপরে, কেবল যুক্ত করুন:

using Application.Code.Helpers;

আপনি স্ট্রিংবিল্ডার যে কোনও শ্রেণিতে ব্যবহার করতে চান তার শীর্ষে এবং যে কোনও সময় আপনি স্ট্রিংবিল্ডার ভেরিয়েবলের সাথে ইন্টেলি-ইন্দ্রিয় ব্যবহার করেন, প্রিপেন্ড এবং প্রিপেন্ডলাইন পদ্ধতিগুলি প্রদর্শিত হবে। কেবল মনে রাখবেন যে আপনি যখন প্রিপেন্ড ব্যবহার করবেন তখন আপনার অ্যাপেন্ডিংয়ের তুলনায় আপনার বিপরীত ক্রমে প্রিপেন্ড করতে হবে।


0

এই কাজ করা উচিত:

aStringBuilder = "newText" + aStringBuilder; 

.NET এ, এটি টাইপের মানগুলির সাথে পুরোপুরি stringকাজ করে তবে ধরণের মানগুলির সাথে কাজ করে না StringBuilder। @ স্কুবাস্টেভের উত্তরটি ভাল কাজ করে।
কনটাঙ্গো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.