एक दोहराए गए वर्ण से भरा, चर लंबाई की एक स्ट्रिंग बनाएं


164

इसलिए, मेरा प्रश्न किसी और के द्वारा जावा फॉर्म में यहां पूछा गया है: जावा - निर्दिष्ट लंबाई के साथ एक नया स्ट्रिंग उदाहरण बनाएं और विशिष्ट चरित्र से भरा हुआ है। सबसे अच्छा उपाय?

। । । लेकिन मैं इसके जावास्क्रिप्ट समकक्ष की तलाश कर रहा हूं।

मूल रूप से, मैं प्रत्येक फ़ील्ड के "अधिकतम" विशेषता के आधार पर, "#" वर्णों के साथ पाठ फ़ील्ड को गतिशील रूप से भरना चाहता हूं। तो, यदि कोई इनपुट है maxlength="3", तो फ़ील्ड "###" से भरा होगा।

आदर्श रूप से जावा जैसा कुछ होगा StringUtils.repeat("#", 10);, लेकिन, अब तक, सबसे अच्छा विकल्प जिसे मैं सोच सकता हूं कि "#" वर्णों के माध्यम से लूप करना है, और अधिकतम लंबाई तक पहुंचने तक, एक समय में एक को जोड़ना होगा। मैं इस भावना को हिला नहीं सकता कि इससे अधिक प्रभावी तरीका है।

कोई विचार?

FYI करें - मैं केवल इनपुट में एक डिफ़ॉल्ट मान सेट नहीं कर सकता, क्योंकि "#" वर्णों को फ़ोकस पर साफ़ करने की आवश्यकता होती है, और, यदि उपयोगकर्ता ने कोई मान दर्ज नहीं किया है, तो उसे धुंधला होने पर "रीफ़िल्ड" करने की आवश्यकता होगी। यह "रीफिल" कदम है जिससे मैं चिंतित हूं


1
क्या आप ऐसा इनपुट क्षेत्र के पाठ को पूरा करने के लिए कर रहे हैं?
फिस्टी मैंगो

@MatthewCox: नहीं, यह अधिकतम गति का दृश्य प्रदर्शन प्रदान करने के लिए अधिक है। इस मामले में, यह फ़ोन नंबर फ़ील्ड के एक सेट के लिए है जो संख्या के 3 भागों में विभाजित हैं। यह दिखाना चाहते हैं कि पहले 2 क्षेत्रों 4. 3 अंक और पिछले जरूरतों की जरूरत है
talemyn

जवाबों:


303

ऐसा करने का सबसे अच्छा तरीका (जो मैंने देखा है) है

var str = new Array(len + 1).join( character );

यह दी गई लंबाई के साथ एक सरणी बनाता है, और फिर इसे दोहराने के लिए दिए गए स्ट्रिंग के साथ जुड़ता है। .join()समारोह सरणी की लंबाई के तत्वों सौंपा मान हैं कि क्या परवाह किए बिना सम्मान करता है, और अपरिभाषित मूल्यों रिक्त स्ट्रिंग के रूप में प्रदान की जाती हैं।

आपको वांछित लंबाई में 1 जोड़ना होगा क्योंकि विभाजक स्ट्रिंग सरणी तत्वों के बीच जाती है ।


बिल्कुल सही किया। :) मुझे parseInt()सरणी को आकार देने के लिए उपयोग करने से पहले इनपुट अधिकतम गति पर उपयोग करने के लिए याद रखने की आवश्यकता है। मुझे इसकी ही खोज थी । । । धन्यवाद!
तावीज़िन

11
ध्यान दें, यह समाधान बहुत धीमा है। यह सेक्सी लग रहा है लेकिन ऐसा करने के लिए शायद गलत तरीका है।
होगन

23
repeatString.prototype में बनाया गया नया फ़ंक्शन अब इसे (ES6 +)
एलेक्सा

बीमार समाधान। इसके लिए धन्यवाद्!
C4d

156

इसे आजमाइए: पी

s = '#'.repeat(10)

document.body.innerHTML = s


4
निश्चित रूप से सबसे आसान कार्यान्वयन, लेकिन यह भी सबसे कम समर्थित है, क्योंकि यह ईसीएमएस्क्रिप्ट 6 का हिस्सा है। अभी जैसा दिखता है, यह केवल फ़ायरफ़ॉक्स, क्रोम और सफारी के डेस्कटॉप संस्करण में समर्थित है।
तालीमेन

5
अगर आपको लताश का उपयोग करने में कोई आपत्ति नहीं है , तो आप निम्नलिखित का उपयोग कर सकते हैं: _.repeat('*',10);
गेरूद ग्राताप

4
यह अब 2018 है और ES6 अच्छी तरह से स्थापित है - यह स्वीकृत उत्तर होना चाहिए। और बाबेल या कुछ इसी तरह का उपयोग नहीं करने वालों के लिए विरासत ब्राउज़रों का समर्थन करने की आवश्यकता के मामले में, आप ऊपर बताए अनुसार, या बैकअप के लिए एक पॉलीफिल का उपयोग कर सकते हैं।
21

@seanTcoyote जितना मैं चाहूंगा, अभी भी ऐसे लोग हैं जिन्हें IE 11 और एड्रॉइड के वेब साक्षात्कार के साथ संघर्ष करना है, जिनमें से कोई भी repeat()विधि का समर्थन नहीं करता है। उस दिन की प्रतीक्षा कर रहा हूं जब मुझे उनकी परवाह नहीं करनी है, खुद को। । ।
तावीमेन

दुर्भाग्य से, IE के साथ संगत नहीं है
लोरेंजो लैर्ट

30

दुर्भाग्य से, हालांकि यहां बताया गया Array.join का दृष्टिकोण एकसाथ है, यह एक स्ट्रिंग-संघनन-आधारित कार्यान्वयन की तुलना में लगभग 10X धीमा है। यह विशेष रूप से बड़े तार पर खराब प्रदर्शन करता है। पूर्ण प्रदर्शन विवरण के लिए नीचे देखें।

फ़ायरफ़ॉक्स, क्रोम, Node.js MacOS, Node.js उबंटू, और सफारी पर, सबसे तेज़ कार्यान्वयन जिसे मैंने परीक्षण किया था:

function repeatChar(count, ch) {
    if (count == 0) {
        return "";
    }
    var count2 = count / 2;
    var result = ch;

    // double the input until it is long enough.
    while (result.length <= count2) {
        result += result;
    }
    // use substring to hit the precise length target without
    // using extra memory
    return result + result.substring(0, count - result.length);
};

यह क्रिया है, इसलिए यदि आप एक ट्रिक कार्यान्वयन चाहते हैं तो आप भोले दृष्टिकोण के साथ जा सकते हैं; यह अभी भी Array.join दृष्टिकोण की तुलना में 2X से 10X बेहतर बेटवेब करता है, और छोटे आदानों के लिए दोहरीकरण कार्यान्वयन से भी तेज है। कोड:

// naive approach: simply add the letters one by one
function repeatChar(count, ch) {
    var txt = "";
    for (var i = 0; i < count; i++) {
        txt += ch;
    }
    return txt;
}

अग्रिम जानकारी:


1
यह मेरे समाधान की तुलना में अभी भी बहुत धीमी है (परिमाण के 2 से 3 आदेश)।
होगन

@ होगन आपका समाधान कहीं से भी भरा हुआ तार नहीं बनाता है। आप इसे स्वयं बनाते हैं और फिर एक सबस्ट्रिंग निकालते हैं।
स्टेनी

यह दृष्टिकोण बहुत बड़े तारों के लिए Node.js में Array.join की तुलना में 10x धीमा है।
अंशुल कोका

21

मैं एक निरंतर स्ट्रिंग बनाऊंगा और फिर उस पर सबस्ट्रिंग कॉल करूंगा।

कुछ इस तरह

var hashStore = '########################################';

var Fiveup = hashStore.substring(0,5);

var Tenup = hashStore.substring(0,10);

थोड़ा तेज भी।

http://jsperf.com/const-vs-join


1
यह बहुत चालाक है! और यह कई पात्रों वाले स्ट्रिंग पैटर्न के साथ भी काम करता है।
मार्कस

1
बस इस पृष्ठ को फिर से देखें क्योंकि ऐसा लगता है कि यह बहुत अधिक ध्यान आकर्षित कर रहा है और आपके समाधान पर टिप्पणी करना चाहता है। जबकि मुझे निश्चित रूप से आपके दृष्टिकोण की सरलता और गति पसंद है, इसके साथ मेरी सबसे बड़ी चिंता रखरखाव / पुन: उपयोग के आसपास थी। मेरे विशिष्ट परिदृश्य में, मुझे 4 से अधिक वर्णों की आवश्यकता नहीं थी, एक सामान्य कार्य के रूप में, एक निश्चित लंबाई स्ट्रिंग का उपयोग करने का मतलब है कि आपको वापस आना होगा और स्ट्रिंग को अपडेट करना होगा, अगर आपके उपयोग के मामले में कभी भी अधिक वर्णों की आवश्यकता होती है। अन्य दो समाधान उस संबंध में अधिक लचीलेपन की अनुमति देते हैं। हालांकि गति के लिए +1।
तावीज़ेन

1
ओह, और, फ्लिप की ओर (और मुझे पता है कि यह वास्तव में एक शैलीगत चिंता का विषय है, एक प्रोग्रामेटिक की तुलना में), एक 30+ कैरेक्टर स्ट्रिंग को बनाए रखना जो केवल 3-4 वर्णों के लिए कभी भी उपयोग नहीं किया जाएगा। मैं भी । । । फिर, विभिन्न उपयोग के मामलों के समाधान के लचीलेपन के आसपास एक छोटी सी समस्या।
तावीज़िन

@talemyn आईटी में सब कुछ एक व्यापार बंद है। 4 कैरेक्टर की स्ट्रिंग रखें और इसे बड़ा करें या 30 कैरेक्टर का स्ट्रिंग रखें और चिंता न करें। सभी सभी, किसी भी आकार की एक निरंतर स्ट्रिंग - यहां तक ​​कि 1k, आधुनिक मशीनों पर छोटे संसाधन उपयोग है।
होगन

@ होगन - पूरी तरह से सहमत हैं। । । और, यह वास्तव में इस कारण का हिस्सा है कि मैंने गति पर बहुत अधिक जोर नहीं दिया। अपने विशिष्ट उपयोग के मामले में, मुझे तीन स्ट्रिंग्स की तलाश थी जो लंबाई में 3, 3 और 4 वर्ण थे। जबकि Pointy का समाधान सबसे धीमा था, क्योंकि तार कम थे और उनमें से कुछ ही थे, मैं उनके साथ गया क्योंकि मुझे यह पसंद आया कि यह सुव्यवस्थित, आसान-से-पढ़ा जाने वाला और आसानी से बनाए रखने वाला हो। अंत में, वे प्रश्न के विभिन्न रूपों के लिए सभी अच्छे समाधान हैं। । । यह सब इस बात पर निर्भर करता है कि आपकी विशिष्ट स्थिति के लिए प्राथमिकताएं क्या हैं।
तावीज़िन


5

एक महान ES6 विकल्प padStartएक खाली स्ट्रिंग के लिए होगा। ऐशे ही:

var str = ''.padStart(10, "#");

नोट: यह IE (पॉलीफ़िल के बिना) में काम नहीं करेगा।


3
विशेष रूप से किसी भी कारण से कि आप इस ES6 दृष्टिकोण की सिफारिश दूसरे पर ( s = '#'.repeat(10)) @ user4227915 के ऊपर से करें?
तालीम

@ शटामाइन सिंपल सिंटैक्स
मेंडी

3

वह संस्करण जो सभी ब्राउज़रों में काम करता है

यह फ़ंक्शन वही करता है जो आप चाहते हैं, और स्वीकृत उत्तर में सुझाए गए विकल्प की तुलना में बहुत तेज़ प्रदर्शन करते हैं:

var repeat = function(str, count) {
    var array = [];
    for(var i = 0; i <= count;)
        array[i++] = str;
    return array.join('');
}

आप इसे इस तरह उपयोग करते हैं:

var repeatedCharacter = repeat("a", 10);

स्वीकार किए गए उत्तर में प्रस्तावित विकल्प के साथ इस फ़ंक्शन के प्रदर्शन की तुलना करने के लिए, इस फ़िडेल और बेंचमार्क के लिए इस फ़िडल को देखें।

केवल आधुनिक ब्राउज़र के लिए संस्करण

आधुनिक ब्राउज़रों में, अब आप यह भी कर सकते हैं:

var repeatedCharacter = "a".repeat(10) };

यह विकल्प और भी तेज है। हालाँकि, दुर्भाग्य से यह इंटरनेट एक्सप्लोरर के किसी भी संस्करण में काम नहीं करता है।

तालिका के नंबर पहले ब्राउज़र संस्करण को निर्दिष्ट करते हैं जो पूरी तरह से विधि का समर्थन करता है:

यहां छवि विवरण दर्ज करें


3
For Evergreen browsers, this will build a staircase based on an incoming character and the number of stairs to build.
function StairCase(character, input) {
    let i = 0;
    while (i < input) {
        const spaces = " ".repeat(input - (i+1));
        const hashes = character.repeat(i + 1);
        console.log(spaces + hashes);
        i++;
    }
}

//Implement
//Refresh the console
console.clear();
StairCase("#",6);   

आप पुराने ब्राउज़रों के लिए रिपीट के लिए पॉलीफ़िल भी जोड़ सकते हैं

    if (!String.prototype.repeat) {
      String.prototype.repeat = function(count) {
        'use strict';
        if (this == null) {
          throw new TypeError('can\'t convert ' + this + ' to object');
        }
        var str = '' + this;
        count = +count;
        if (count != count) {
          count = 0;
        }
        if (count < 0) {
          throw new RangeError('repeat count must be non-negative');
        }
        if (count == Infinity) {
          throw new RangeError('repeat count must be less than infinity');
        }
        count = Math.floor(count);
        if (str.length == 0 || count == 0) {
          return '';
        }
        // Ensuring count is a 31-bit integer allows us to heavily optimize the
        // main part. But anyway, most current (August 2014) browsers can't handle
        // strings 1 << 28 chars or longer, so:
        if (str.length * count >= 1 << 28) {
          throw new RangeError('repeat count must not overflow maximum string size');
        }
        var rpt = '';
        for (;;) {
          if ((count & 1) == 1) {
            rpt += str;
          }
          count >>>= 1;
          if (count == 0) {
            break;
          }
          str += str;
        }
        // Could we try:
        // return Array(count + 1).join(this);
        return rpt;
      }
    } 

2

होगन और जीरो ट्रिक पोनी के जवाबों के आधार पर। मुझे लगता है कि अच्छी तरह से उपयोग किए जाने वाले मामलों को संभालने के लिए यह तेज और लचीला दोनों होना चाहिए:

var hash = '####################################################################'

function build_string(length) {  
    if (length == 0) {  
        return ''  
    } else if (hash.length <= length) {  
        return hash.substring(0, length)  
    } else {  
        var result = hash  
        const half_length = length / 2  
        while (result.length <= half_length) {  
            result += result  
        }  
        return result + result.substring(0, length - result.length)  
    }  
}  

कृपया अपने उत्तर में कुछ और स्पष्टीकरण जोड़ें क्योंकि एक कोड स्निपेट स्वयं एक उत्तर प्रदान नहीं करता है।
क्लीजर्स

@ लिंड्रो चतुर और प्रसंस्करण को कम करता है! +1
एलएमएससिंह

मुझे लगता है कि आपका मतलब hash.length> = लंबाई
cipak

1

आप एक लाइनर के रूप में फ़ंक्शन की पहली पंक्ति का उपयोग कर सकते हैं यदि आप चाहें:

function repeat(str, len) {
    while (str.length < len) str += str.substr(0, len-str.length);
    return str;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.