Я хочу фильтровать строку после символа '='. Например, если 8 + 9 = 17 Мой вывод должен быть 17. Я могу фильтровать символ до '=' с помощью NSScanner, как сделать обратный ??? Мне нужен эффективный способ сделать это без использования componentsSeparatedByString или создания массиваКак фильтровать строку после определенного символа в iOS?
ответ
Все, кажется, нравится использовать componentsSeparatedByString
но это довольно неэффективно когда вы просто хотите одну часть строки.
Попробуйте это:
NSString *str = @"8+9=17";
NSRange equalRange = [str rangeOfString:@"=" options:NSBackwardsSearch];
if (equalRange.location != NSNotFound) {
NSString *result = [str substringFromIndex:equalRange.location + equalRange.length];
NSLog(@"The result = %@", result);
} else {
NSLog(@"There is no = in the string");
}
Update:
Примечание - для этого конкретного примера, разница в эффективности является незначительным, если только делается один раз.
Но в целом, используя componentsSeparatedByString:
, вы сможете сканировать всю строку, которая ищет все случаи разграничения. Затем он создает массив со всеми подстроками. Это здорово, когда вам нужно большинство этих подстрок.
Когда вам нужна только одна часть более крупной струны, это очень расточительно. Нет необходимости сканировать всю строку. Нет необходимости создавать массив. Нет необходимости получать все остальные подстроки.
+1, поскольку у меня уже есть смутное представление о том, что вы правы. Не могли бы вы объяснить относительные преимущества? Я рекомендую OP принять ваш ответ, а не мой. –
См. Мое обновление для объяснения. – rmaddy
NSArray * array = [string componentsSeparatedByString:@"="];
if (array)
{
NSString * desiredString = (NSString *)[array lastObject]; //or whichever the index
}
else
{
NSLog(@""); //report error - = not found. Of array could somehow be not created.
}
Примечание: Хотя это очень популярное решение расщепления, только стоит попробовать, когда каждый подстрока, разделенная строка разделителя требуется. Ответ rmaddy предлагает лучший механизм, когда нужно только получить небольшую часть строки. Используйте это вместо этого подхода, когда требуется только небольшая часть строки.
Это очень неэффективный способ получить только один маленький кусок большей строки. – rmaddy
Это простой и эффективный LOC. Конечно, за +1! –
проверить количество массивов, затем назначить if ([количество массивов]> 1) { NSString * wishString = (NSString *) [array objectAtIndex: 1]; // или в зависимости от того индекс } еще { NSLog (@ ""); // Сообщить об ошибке - = не найден. Из массива можно как-то не создавать. } – shyla
Используйте это:
NSString *a [email protected]"4+6=10";
NSLog(@"%@",[a componentsSeparatedByString:@"="])
;
Log: Practice[7582:11303] (
"4+6",
10
)
Попробуйте использовать этот один
NSArray *arr = [string componentsSeparatedByString:@"="];
if (arr.count > 0)
{
NSString * firstString = [arr objectAtIndex:0];
NSString * secondString = [arr objectAtIndex:1];
NSLog(@"First String %@",firstString);
NSLog(@"Second String %@",secondString);
}
Выход
Первая строка 8 + 9
Второй струнный 17
Этот код выйдет из строя, если строка не содержит '='. – rmaddy
Первым NSLog должен быть NSLog (@ "First String% @", firstString); –
@PradeepReddyKyp Спасибо за исправление. –
'componentsSeparatedByString' является (в моем * мнении) одним из наиболее часто злоупотребляемых методов. Зачем создавать массив? Разве не 'rangeOfString' +' substringFromIndex' намного больше? Но SO-ответчики и читатели, похоже, любят это! - Извините, я должен был сказать это однажды. –
Мартин R прав, но я не был уверен, насколько лучше использовать параметр rangeOfString. Я бы рекомендовал принять ответ @ rmaddy вместо моего, нажав галочку ниже ответа. –
Можете ли вы объяснить, почему вам не нравится предлагаемые решения (например, используя 'componentsSeparatedByString')? – Shai