2008-11-04 12 views
51

यह आसान होना चाहिए की दी गई संख्या को दोहराते हुए NSString बनाएँ, लेकिन मैं एक कठिन समय सबसे आसान समाधान खोजने आ रही है।अन्य स्ट्रिंग बार

मैं एक NSString कि खुद के साथ concatenated बार की दी गई संख्या एक और स्ट्रिंग के बराबर है की जरूरत है।

एक बेहतर स्पष्टीकरण के लिए, निम्न अजगर उदाहरण पर विचार करें:

>> original = "abc" 
"abc" 
>> times = 2 
2 
>> result = original * times 
"abcabc" 

किसी भी संकेत?


संपादित करें:

मैं, एक समाधान Mike McMaster's answer से मिलता-जुलता पोस्ट करने के लिए जा रहा था OmniFrameworks से कार्यान्वयन देखने के बाद:

// returns a string consisting of 'aLenght' spaces 
+ (NSString *)spacesOfLength:(unsigned int)aLength; 
{ 
static NSMutableString *spaces = nil; 
static NSLock *spacesLock; 
static unsigned int spacesLength; 

if (!spaces) { 
spaces = [@"    " mutableCopy]; 
spacesLength = [spaces length]; 
    spacesLock = [[NSLock alloc] init]; 
} 
if (spacesLength < aLength) { 
    [spacesLock lock]; 
    while (spacesLength < aLength) { 
     [spaces appendString:spaces]; 
     spacesLength += spacesLength; 
    } 
    [spacesLock unlock]; 
} 
return [spaces substringToIndex:aLength]; 
} 

कोड फ़ाइल से reproduced:

Frameworks/OmniFoundation/OpenStepExtensions.subproj/NSString-OFExtensions.m 
से OpenExtensions ढांचे पर

The Omni Group द्वारा।

उत्तर

145

वहाँ एक विधि stringByPaddingToLength:withString:startingAtIndex: कहा जाता है:

[@"" stringByPaddingToLength:100 withString: @"abc" startingAtIndex:0] 

ध्यान दें कि अगर आप चाहते हैं 3 एबीसी, का उपयोग 9 (3 * [@"abc" length]) या इस तरह श्रेणी बनाने की तुलना में:

@interface NSString (Repeat) 

- (NSString *)repeatTimes:(NSUInteger)times; 

@end 

@implementation NSString (Repeat) 

- (NSString *)repeatTimes:(NSUInteger)times { 
    return [@"" stringByPaddingToLength:times * [self length] withString:self startingAtIndex:0]; 
} 

@end 
+3

+1। और यहां बताया गया है कि मैंने प्रश्न चिह्नों की एक अल्पविराम से अलग सूची बनाने के लिए इसका उपयोग कैसे किया (SQLite को खिलाने के लिए) - '[@" "स्ट्रिंगबीपैडिंग टोलेंथेंथ: [फ़ील्ड गिनती] * 2-1 साथ स्ट्रिंग: @" ?, "प्रारंभ एट इंडेक्स: 0] '। – noamtm

7
NSString *original = @"abc"; 
int times = 2; 

// Capacity does not limit the length, it's just an initial capacity 
NSMutableString *result = [NSMutableString stringWithCapacity:[original length] * times]; 

int i; 
for (i = 0; i < times; i++) 
    [result appendString:original]; 

NSLog(@"result: %@", result); // prints "abcabc" 
+0

मैं कोशिश कर रहा था कुछ आसान के साथ आने के लिए, लेकिन मुझे लगता है कि यह सबसे छोटा रास्ता है। –

+0

मैंने इसे पहले निर्दिष्ट करके स्वीकृति के बाद थोड़ा और अधिक कुशल बना दिया और क्षमता = [मूल लंबाई] * समय –

+1

बस पूर्णता के लिए, अगर किसी कारण से आप बड़ी संख्या का उपयोग करना चाहते हैं, तो आप इसे शक्ति- दो कॉन्सटेनेशन (उदाहरण के लिए foo * 10 = foo * 2 + foo * 8; foo * 8 = foo * 4 + foo * 4; foo * 4 = foo * 2 + foo * 2 -> 3 के बजाय 3 कॉन्सट ऑपरेशंस) । –

1

आप अजगर में कोको का उपयोग कर रहे हैं, तो आप सिर्फ ऐसा कर सकते हैं, के रूप में PyObjC imbues अजगर unicode वर्ग की क्षमताओं के सभी के साथ NSString

अन्यथा, वहाँ दो तरीके हैं।

एक n बार में उसी स्ट्रिंग के साथ एक सरणी बनाना है, और componentsJoinedByString: का उपयोग करें। कुछ इस तरह:

NSMutableArray *repetitions = [NSMutableArray arrayWithCapacity:n]; 
for (NSUInteger i = 0UL; i < n; ++i) 
    [repetitions addObject:inputString]; 
outputString = [repetitions componentsJoinedByString:@""]; 

दूसरी तरह के एक खाली NSMutableString के साथ शुरू और n बार इसे करने के लिए स्ट्रिंग संलग्न करने के लिए हो सकता है, इस तरह:

NSMutableString *temp = [NSMutableString stringWithCapacity:[inputString length] * n]; 
for (NSUInteger i = 0UL; i < n; ++i) 
    [temp appendString:inputString]; 
outputString = [NSString stringWithString:temp]; 

आप stringWithString: बाहर कटौती करने के लिए सक्षम हो सकता है अगर आप यहां एक म्यूटेबल स्ट्रिंग वापस करने के लिए ठीक है तो कॉल करें। अन्यथा, आपको शायद एक अपरिवर्तनीय स्ट्रिंग वापस करनी चाहिए, और stringWithString: संदेश का अर्थ है कि आपके पास स्मृति में स्ट्रिंग की दो प्रतियां हैं।

इसलिए, मैं componentsJoinedByString: समाधान सलाह देते हैं।

[संपादित करें: उधार विचार Mike McMaster's answer से …WithCapacity: तरीकों का उपयोग करने के लिए।]

+0

का उपयोग कर शीर्ष उत्तर के रूप में उतना ही कुशल नहीं है घटक JoinedByString का उपयोग करने के विकल्प के लिए धन्यवाद। –

+0

हाँ, अच्छा सुझाव। शायद एक किशोर थोड़ा और अधिक कुशल है कि मेरा (स्वीकार्य रूप से जेनेरिक) समाधान। –

4

प्रदर्शन के लिए, आप कुछ इस तरह के साथ सी में छोड़ सकता है:

+ (NSString*)stringWithRepeatCharacter:(char)character times:(unsigned int)repetitions; 
{ 
    char repeatString[repetitions + 1]; 
    memset(repeatString, character, repetitions); 

    // Set terminating null 
    repeatString[repetitions] = 0; 

    return [NSString stringWithCString:repeatString]; 
} 

इस पर एक वर्ग विस्तार के रूप में लिखा जा सकता है एनएसएसटींग कक्षा। शायद कुछ चेक हैं जिन्हें वहां फेंक दिया जाना चाहिए, लेकिन यह सीधे आगे की ओर है।

+0

विशेष विचार, विशेष रूप से प्रदर्शन भूख परिदृश्य के लिए। धन्यवाद! –

+0

जांचें कि दोहराव> 0? –

+0

डेविड, पुनरावृत्ति एक हस्ताक्षरित int – jessecurry

2

उपरोक्त पहली विधि एक वर्ण के लिए है। यह एक पात्रों की एक स्ट्रिंग के लिए है। इसका इस्तेमाल एक चरित्र के लिए भी किया जा सकता है लेकिन अधिक ओवरहेड है।

+ (NSString*)stringWithRepeatString:(char*)characters times:(unsigned int)repetitions; 
{ 
    unsigned int stringLength = strlen(characters); 
    unsigned int repeatStringLength = stringLength * repetitions + 1; 

    char repeatString[repeatStringLength]; 

    for (unsigned int i = 0; i < repetitions; i++) { 
     unsigned int pointerPosition = i * repetitions; 
     memcpy(repeatString + pointerPosition, characters, stringLength);  
    } 

    // Set terminating null 
    repeatString[repeatStringLength - 1] = 0; 

    return [NSString stringWithCString:repeatString]; 
} 
+0

कोई त्रुटि है, मुझे लगता है कि चक्र के लिए अंदर,: 'अहस्ताक्षरित int pointerPosition = मैं repetitions *;' होना चाहिए 'अहस्ताक्षरित int pointerPosition = मैं * stringLength;' जहां ** मैं repetitions * ** हो जाता है ** i * स्ट्रिंग लम्बाई **। मानक पुस्तकालय में एक ही कॉल में इसे करने के लिए – mginius

संबंधित मुद्दे