Tôi đã viết chức năng này mà shuffles các nội dung của một NSString
, và nó có vẻ làm việc, nhưng mỗi bây giờ và sau đó nó bị treo. Đây có thể là một đường vòng, nhưng tôi đặt các ký tự vào một mảng, trao đổi các phần tử trong mảng một cách ngẫu nhiên, và sau đó biến mảng trở lại thành một chuỗi.Xáo trộn chữ cái trong một NSString trong mục tiêu-C
Tôi không chắc chắn những gì tôi đang làm là không an toàn làm cho nó sụp đổ. Tôi nghĩ rằng có lẽ tôi đang thiết lập finalLettersString = result
, nhưng tôi cũng đã thử finalLettersString = [NSString stringWithString:result]
và điều đó cũng bị treo. Lý do tôi bối rối là bởi vì nó không sụp đổ mỗi lần. Tôi chỉ tiếp tục nhấn nút trộn, và đôi khi nó bị treo. Tôi nên tìm nơi nào?
/* This function shuffles the letters in the string finalLettersString */
-(IBAction)shuffleLetters:(id)sender{
int length = [finalLettersString length];
NSMutableArray * letters = [NSMutableArray arrayWithCapacity:length];
NSLog(@"final letters: %@", finalLettersString);
for(int i = 0; i < length; i++){
char ch = [finalLettersString characterAtIndex:i];
NSLog(@"%c", ch);
NSString * cur = [NSString stringWithFormat:@"%c", ch];
[letters insertObject:cur atIndex:i];
}
NSLog(@"LETTERS:: %@", letters);
for(int i = length - 1; i >= 0; i--){
int j = arc4random() % (i + 1);
//NSLog(@"%d %d", i, j);
//swap at positions i and j
NSString * str_i = [letters objectAtIndex:i];
[letters replaceObjectAtIndex:i withObject:[letters objectAtIndex:j]];
[letters replaceObjectAtIndex:j withObject:str_i];
}
NSLog(@"NEW SHUFFLED LETTERS %@", letters);
NSString * result = @"";
for(int i = 0; i < length; i++){
result = [result stringByAppendingString:[letters objectAtIndex:i]];
}
NSLog(@"Final string: %@", result);
finalLettersString = result;
finalLetters.text = finalLettersString;
}
Cảm ơn! Chắc chắn là một giải pháp tốt hơn nhiều. Một vấn đề thực sự là bạn không thể sử dụng NSUIntegers, bởi vì - trên 0 dẫn đến một số thực sự lớn và không -1 kể từ khi unsigned của nó. Tôi đã nhận nó để làm việc bằng cách sử dụng ints và giữ lại. Trong tình huống này, bạn có nghĩ rằng nó là thích hợp hơn để giữ lại hoặc phân bổ một cách rõ ràng? – jkeesh
@jkeesh: Điểm tốt về các số nguyên không dấu. Liên quan đến phân bổ một cách rõ ràng, nó phụ thuộc vào nền tảng đích. Nếu bạn đang nhắm mục tiêu iPhone, một số người nói để tránh các autorelease hồ bơi khi bạn có thể thanh lịch làm như vậy, nhưng đối với Mac OS X (tức là hệ thống với bộ nhớ nhiều hơn so với iPhone) nó sẽ làm cho không có sự khác biệt đáng chú ý. Cá nhân, tôi luôn phân bổ rõ ràng hơn là chống lại một 'autorelease' với một' giữ lại', nhưng kết quả cũng giống nhau. – dreamlax
Trong ngày và tuổi của quốc tế hóa, bạn không thể giả định rằng một bản đồ unichar cho một nhân vật. – JeremyP