Re: reverse scanner
Re: reverse scanner
- Subject: Re: reverse scanner
- From: Boyd Collier <email@hidden>
- Date: Tue, 13 Aug 2013 18:00:11 -0700
Well, after more testing, I found that my first version (labelled "frontal attack") doesn't always work. Just in case anyone other than me cares, here's a new version that seems to work properly. Sorry for the noise.
Boyd
// frontal attack
// testString = @"0756013";
testString = @"4756013";
// testString = @"0756";
// testString = @"0";
// alleles and digitsPerAllele are passed as arguments; the values shown here are just for testing
int alleles = 3;
NSUInteger digitsPerAllele = 3;
NSString *subString;
NSRange range;
int theInt;
int i;
int sLength = [testString length];
range.location = 0;
int remainder = [testString length] % digitsPerAllele;
if (remainder > 0) {
range.length = remainder;
subString = [testString substringWithRange:range];
theInt = [subString intValue];
--alleles;
range.location = remainder;
sLength = sLength - remainder;
}
if (sLength > 0) {
range.length = digitsPerAllele;
for (i = 0; i < alleles; i++ ) {
subString = [testString substringWithRange:range];
theInt = [subString intValue];
range.location += digitsPerAllele;
}
}
Begin forwarded message:
> From: Boyd Collier <email@hidden>
> Subject: Re: reverse scanner
> Date: August 12, 2013 1:00:56 PM PDT
> To: Cocoa Dev List <email@hidden>
>
> I've come up with a couple of reasonably straight-forward solutions to my problem, but first, thanks to everyone who offered suggestions. Even though I didn't choose to use them, your willingness to make them is definitely appreciated.
>
> Here are my solutions (note that there are 2, one labelled "attack from the rear", the other labelled "frontal attack"). I won't claim that they have been really thoroughly tested, but I have tried a variety of values for testString, d, digitsPerAllele and alleles and both methods appear to work. If anyone sees a problem or an improvements, please let me know. Right now, I favor the frontal attack, which occurred to me in the middle of the night -- I seldom have reason to use the % operator and so didn't think of it right away. Of course, in actual use, I'll first take steps to separate the string that's being processed into substrings, if the original string uses a ";" (for example) to separate allelic values, e.g. if the string being processed is 04;756;013.
>
> NSString *testString = @"0756013";
> NSUInteger d = 3;
> NSUInteger digitsPerAllele = d;
> NSUInteger alleles = 3;
>
> NSString *subString;
> NSRange range;
> int theInt;
>
> // attack from the rear
> int startOfRange = [testString length];
> int length = d;
> int i;
> for (i = 0; i < alleles; i++ ) {
> startOfRange = startOfRange-d;
> if (startOfRange < 0) {
> length = length + startOfRange; // note that startOfRange is negative here
> if (length <= 0)
> break;
> startOfRange = 0;
> d = length;
> }
> range.location = startOfRange;
> range.length = d;
> subString = [testString substringWithRange:range];
> theInt = [subString intValue];
> }
>
> // frontal attack
> testString = @"04756013";
> int remainder = [testString length] % digitsPerAllele;
> range.location = 0;
> range.length = remainder;
> subString = [testString substringWithRange:range];
> theInt = [subString intValue];
> --alleles;
> range.location = remainder;
> range.length = digitsPerAllele;
> for (i = 0; i < alleles; i++ ) {
> subString = [testString substringWithRange:range];
> theInt = [subString intValue];
> range.location += digitsPerAllele;
> }
>
>
> On Aug 10, 2013, at 10:07 AM, Boyd Collier <email@hidden> wrote:
>
>> I'm dealing with a situation in which I have to scan strings that are separated by tabs, and for each string, I have to extract two numerical values, with these values being separated by a non-numerical character or not being separated by any character at all. I know the maximum number of characters used to represent each number, but unfortunately, the first character in the group of characters used to represent the first number can, quite arbitrarily, be either a 0 or missing. For example, with the number of characters used to represent each number known to be 2, the strings 607, 0607, 06;07 (note the semicolon between 06 and 07) should all result in 6 and 7 being extracted as the two numerical values. Of course, I'd like to do something simple, and were it not for the arbitrary inclusion of a leading 0, it would be quite simple to use an instance of NSScanner. Or, if there were such a beast as NSReverseScanner, it would also be relatively straight forward, but so far as I'm aware, no such beast exists. I can think of a couple of ways do accomplish this task, but if someone has already come up with a clean way of scanning in reverse, I'd appreciate hearing from them.
>>
>> Boyd
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden