#ios #objective-c #nsstring
#iOS #objective-c #nsstring
Вопрос:
У меня есть NSArray
строковые фразы, такие как @ [@"unanswered questions", @"inspection purpose not selected", @"customer name empty"]
.
Я хотел бы объединить эти строки в строку, разделенную запятой, со словом @"and"
, находящимся между двумя последними элементами.
NSArray
componentsJoinedByString
будет объединяться с помощью запятых, но не будет вставляться @" and "
.
Есть ли простой способ сделать это?
Ответ №1:
Попробуйте это:
NSArray *array = @[@"unanswered questions", @"inspection purpose not selected", @"customer name empty"];
NSString *str = array[0];
if (array.count > 1)
for (int i=1; i<array.count-1 ;i ) {
str = [NSString stringWithFormat:@"%@, %@",str,array[i]];
}
str = [NSString stringWithFormat:@"%@ and %@",str,array.lastObject];
}
NSLog(@"%@",str);
Комментарии:
1. Это определенно работает! Спасибо! Я бы хотел, чтобы это не создавало так много строковых объектов. Кажется, что это немного расходует память, но это проклятие неизменности.
2. потому что он должен добавляться в изменяемую строку.
Ответ №2:
Вот что я в итоге сделал.
(NSString*)joinStringArrayWithAnd:(NSArray*)strings
{
if (strings.count > 1) {
NSMutableArray *mutableStrings = [strings mutableCopy];
mutableStrings[strings.count - 1] = [NSString stringWithFormat:@"and %@", strings[strings.count - 1]];
strings = mutableStrings;
}
return [strings componentsJoinedByString:@", "];
}
Комментарии:
1. разве вы не должны сидеть
strings = mutableStrings
в своемif
?
Ответ №3:
Вызовите componentsJoinedByString
, чтобы получить ваши строки, разделенные запятыми, затем замените последнюю запятую на @" and "
Комментарии:
1. Это интересная идея. В итоге я добавил «и» к последнему пункту, который очень похож на то, что вы предложили.
2. Хорошее решение, оно самое короткое здесь, состоящее всего из двух строк. Однако этот подход потерпит неудачу, если ваша последняя строка содержит запятые по какой-то сумасшедшей причине!
3. Я тоже думал об этом, но это уже другая проблема, верно? Разделитель запятой не выполняется, потому что у вас уже есть запятые.
Ответ №4:
Более гибким решением было бы перебрать каждую строку NSString в вашем массиве и добавить ее к конечной строке:
NSString *finalString = @"";
//Iterate over the strings from your array
for (int i=0; i<[yourArray count]; i ) {
if(i != yourArray.count-1)
finalString = [finalString stringByAppendingString:[NSString stringWithFormat:@"%@, ", yourArray[i]]];
else
finalString = [finalString stringByAppendingString:[NSString stringWithFormat:@"and %@", yourArray[i]]];
}
Комментарии:
1. Мне нравится этот вариант, но если длина строк равна всего 1, он будет помещать и только перед одним элементом.
2. Правильно. Однако вы можете проверить количество массивов перед итерацией.
3. Вы должны установить свой
finalString = yourArray[0]
, а затем перейти от 1, в противном случае вы начнете с запятой.4. На самом деле формат строки — «%@, » , поэтому она не будет начинаться с запятой. Но да, это альтернатива.
5. @Sebyddd Ах да, у вас
, and
там будет. Мой плохой.
Ответ №5:
Вот ответ Давида Розетто, но с использованием изменяемой строки:
NSArray *array = @[@"unanswered questions", @"inspection purpose not selected", @"customer name empty"];
NSMutableString *str = [NSMutableString stringWithString:array[0]];
if (array.count > 1) {
for (int i = 1; i < array.count - 1; i ) {
[str appendFormat:@", %@", array[i]];
}
[str appendFormat:@" and %@", array.lastObject];
}
NSLog(@"%@", str);
Ответ №6:
Всегда ли количество элементов в массиве фиксировано? Если это так, вы могли бы сделать это с помощью чего-то вроде:
NSString *комбинированный = [NSString stringWithFormat: @»%@, %@ и %@», фразы [0], фразы [1], фразы[2]];
-кен
Комментарии:
1. Длина не всегда одинакова, и иногда это может быть один элемент.