2012-06-17 51 views
1

我知道我可以使用characterAtIndex來遍歷兩個NSString對象的每個字符:並比較它們,但是如果我經常使用這個函數,這種方法會非常昂貴。如何獲得Objective-C(iOS版)中2個字符串之間的第一個不同字符?

有沒有什麼內置的,或更有效的方式來做到這一點?

+0

爲什麼會變成這樣昂貴?它是O(n),N是字符串的大小 – Alan

+0

我對StackOverflow的研究讓我想到了這個假設 - 你認爲它會和C0deH4cker下面描述的方法有相同的性能嗎? – Anton

+1

唯一的性能節省我可以想到會是檢查characterAtIndex的邊界。 – Alan

回答

2

我能想到的最快捷的方法是從中獲取C字符串,然後遍歷字符串。

只是一個簡單的例子(其固定到您喜歡):

const char* myCString = [myNSStringInstance UTF8String]; 
const char* string2 = [nsstring2 UTF8String]; 

// Assume same length. You can fix this 
for(i = 0; i < strlen(myCString); i++) { 
    if(myCString[i] != string2[i]) { 
     // Do something here... 
    } 
} 
+0

Xcode告訴我應該使用「const char *」而不是「ch在這裏「。它是否正確? – Anton

+0

是的,UTF8String需要是'const',否則你可以很容易地從NSString的下面修改內容(這是不可改變的設計) – Alan

+1

請注意,當你調用-UTF8String方法時,你將字符串從UTF-16編碼爲UTF-8編碼。您要求NSString類複製字符串內存,並遍歷每個字符以從UTF-16轉換爲UTF-8。這比直接調用-characterAtIndex更有效嗎? – Darren

0

這是一個豆蔻hackish的,但你可以得到的C-串每個然後用指針索引。相同的基本算法爲你提到的想法,但理論上那樣有效,你可以合理預期的解決方案是(只盯着兩個內存地址,並比較其內容

僞代碼:

char *stringA = [stringA cStringUsingEncoding:NSUTF8StringEncoding]; 
char *stringB = [stringB cStringUsingEncoding:NSUTF8StringEncoding]; 
int mismatchIndex = -1; 
for(int i = 0; i<shorterStringLength; i++) { 
    if (stringA[i] != stringB[i]) { 
     mismatchIndex = i; 
     break; 
    } 
} 
相關問題