componentsSeperatedByString returns full word [duplicate] - ios

This question already has answers here:
Is there a simple way to split a NSString into an array of characters?
(4 answers)
Closed 9 years ago.
I am trying to get each letter of an NSString using this line of code:
NSArray *array = [string componentsSeparatedByString:#""];
//string is equal to Jake
NSLog(#"Array Count:%d",[array count]);
I am expecting to get each letter of the word "Jake" but instead I am getting the whole word. Why?

From Apple's Doc about this method
NSString *list = #"Norman, Stanley, Fletcher";
NSArray *listItems = [list componentsSeparatedByString:#", "];
produces an array { #"Norman", #"Stanley", #"Fletcher" }.
So empty separator will not separate each character of string, this
method doesn't work this way.
Here is an answer for your question
How to convert NSString to NSArray with characters one by one in Objective-C

The idea of separating a string by nothing doesn't logically make sense, it is like trying to divide by zero.
But to answer the question:
NSMutableArray *stringComponents = [NSMutableArray arrayWithCapacity:[string length]];
for (int i = 0; i < [string length]; i++) {
NSString *character = [NSString stringWithFormat:#"%c", [string characterAtIndex:i]];
[stringComponents addObject:character];
}`

Related

How can I substring in a required format in ios [duplicate]

This question already has answers here:
How do you detect words that start with “#” or “#” within an NSString?
(6 answers)
Closed 7 years ago.
I have a string like this ,
NSString *strTest = #"Hii how are you doing #Ravi , how do u do #Kiran where are you #Varun";
I want a substring from the above string which contains only the words which starts with '#'
i.e I need
NSString *strSubstring = #"Ravi #kiran #varun";
Please help me out how could I achieve this
Separate the string like below :-
NSArray * names = [myString componentsSeparatedByString:#" "];
names array will now contain all the words in the string, now you can iterate over the array and check which of its index contains "#" character.
If you find "#", store that index value in some variable.
you will love implementing this code. I have used a regular expression to perform the job. It will give you the matching strings.
NSString *strTest = #"Hii how are you doing #Ravi , how do u do #Kiran where are you #Varun";
NSError *error;
//&[^;]*;
NSRegularExpression *exp =[NSRegularExpression regularExpressionWithPattern:#"#[^ ]*" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *s1= [exp matchesInString:strTest options:NSMatchingReportCompletion range:NSMakeRange(0, [strTest length]) ];
[s1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSTextCheckingResult *result = obj;
NSString *str = [strTest substringWithRange:result.range];
NSLog(#"str %#",str);
}];

Split NSString in substring [duplicate]

This question already has answers here:
NSString to NSArray
(7 answers)
Closed 8 years ago.
I want to split a string apple into substrings and want to store it in a array where I can get a at array[0] index p at array[1] and so on. Can anyone help me with that?
NSMutableArray *stringBuffer = [NSMutableArray arrayWithCapacity:[string length]];
for (int i = 0; i < [string length]; i++) {
[stringBuffer addObject:[NSString stringWithFormat:#"%C", [string characterAtIndex:i]]];
}
// doing stuff with the array
There are many ways to achieve this, few of them i am going to mention here:-
1)
NSMutableArray *yourArray = [NSMutableArray array];
for (int i = 0; i < [yourString length]; i++) {
[yourArray addObject:[NSString stringWithFormat:#"%C", [yourString characterAtIndex:i]]];
}
2) you can see this answer https://stackoverflow.com/a/3581549/1865424.
There are other ways too.
See: Convert NSString into char array
I don't know if the first of the 4 answers is the most efficient, but it works, is pretty clear in terms of how it's written and unless you've a particularly long string or high frequency of calls, is probably good enough.
You can use
const char* x = [String UTF8String];
then access characters like x[0] x[1] and so on.

Print symbols that were met in the text, no duplicates

I have been struggling with this question for couple days now. Really need your help and opinion.
We have a string, that holds a text:
NSString *contentOfFile = [[NSString alloc] initWithString:#"This is string#1"];
Now I have to log symbols, that were met in this string without duplicates. Result should look like this:
whitespace symbol here
#
1
g
h
i
n
r
s
t
I know that this is solved very simple in C code using char set and iterators but I am looking for the same simple and elegant way of handling this operation in objective-c.
I was thinking of using NSCharacterSet on the string somehow but I have a lack of knowledge in objective-c so I need your help guys please. Thanks in advance to everyone who replies.
Take advantage of a trait of NSSet: Its members are distinct.
NSString *contentOfFile = #"This is string#1";
NSMutableSet *set = [NSMutableSet set];
NSUInteger length = [contentOfFile length];
for (NSUInteger index = 0; index < length; index++)
{
NSString *substring = [contentOfFile substringWithRange:NSMakeRange(index, 1)];
[set addObject:substring];
}
NSLog(#"%#", set);
However, there's one remaining problem, and that is the members of a set are also unordered. Fortunately, arrays are ordered. So if you change the last line:
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:#"self" ascending:YES];
NSArray *array = [set sortedArrayUsingDescriptors:#[sortDescriptor]];
NSLog(#"%#", array);
If case insensitivity is important to you, there unfortunately is no 'case-insensitive' option for NSSet. However, you could convert your source string to all lowercase, like this:
NSString *contentOfFile = [#"This is string#1" lowercaseString];
and this would give you results exactly matching your sample output.
// Create the string
NSString *contentOfFile = #"This is string#1";
// Remove all whitespaces
NSString *whitespaceRemoval = [contentOfFile stringByReplacingOccurrencesOfString:#" " withString:#""];
// Initialize an array to store the characters
NSMutableArray *components = [NSMutableArray array];
// Iterate through the characters and add them to the array
for (int i = 0; i < [whitespaceRemoval length]; i++) {
NSString *character = [NSString stringWithFormat:#"%c", [whitespaceRemoval characterAtIndex:i]];
if (![components containsObject:character]) {
[components addObject:character];
}
}

How to filter a string after a particular character in iOS? [duplicate]

This question already has answers here:
Split an NSString to access one particular piece
(7 answers)
Closed 9 years ago.
I want to filter string after character '='. For eg if 8+9=17 My output should be 17. I can filter character before '=' using NSScanner, how to do its reverse??? I need a efficient way to do this without using componentsSeparatedByString or creating an array
Everyone seems to like to use componentsSeparatedByString but it is quite inefficient when you just want one part of a string.
Try this:
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:
Note - for this specific example, the difference in efficiencies is negligible if it is only being done once.
But in general, using componentsSeparatedByString: is going to scan the entire string looking for every occurrence of the delimiter. It then creates an array with all of the substrings. This is great when you need most of those substrings.
When you only need one part of a larger string, this is very wasteful. There is no need to scan the entire string. There is no need to create an array. There is no need to get all of the other substrings.
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.
}
NOTE:
Though this is very popular splitting solution, it is only worth trying whenever every substring separated by separator string is required. rmaddy's answer suggest better mechanism whenever the need is only to get small part of the string. Use that instead of this approach whenever only small part of the string is required.
Try to use this one
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);
}
Output
First String 8+9
Second String 17
Use this:
NSString *a =#"4+6=10";
NSLog(#"%#",[a componentsSeparatedByString:#"="])
;
Log: Practice[7582:11303] (
"4+6",
10
)

how to convert NSMutableArray into NSString? [duplicate]

This question already has answers here:
How to convert elements of NSMutableArray to NSString
(3 answers)
Closed 9 years ago.
I am trying to convert (or copy?) a NSMutableArray into a NSString. I guess my problem is that I don't really understand the structure of a NSString. In my limited knowledge, a string could look like this: in iphone
Try this code:-
NSString *string = [array componentsJoinedByString:#","];
take the NSMutableString and append every array string into your string
like
string = [string appendString:[NSString stringWithFormat:"%#", [array objectAtIndex:i]]];

Resources