Iphone - How do you sort an NSMutableArray into ascending order? - nsmutablearray

In Xcode i am trying to make a graph into which some points (X,Y) are given by the user.The user can choose how many points he or she wants to plot on the graph. I have stored the X axis points in an NSMutableArray and the Y axis points in an NSMutableArray but now i need to sort these into ascending order so i can fix a bug with the graph when having two points with the same x or y axis plot. The NSMutableArrays contains primitive int's. An example of what i need to do is if i am given 4 coordinates for one of the axis such as 4,8,5,3 i need the array to be sorted into 3,4,5,8
The code below doesn't include the graph generation because it is quite long
Thanks for the help! -
int userInputCount;
printf("How many coordinates would you like to plot? ");
scanf("%i", &userInputCount);
printf("\n");
NSMutableArray * xCoordArray = [[NSMutableArray alloc] init];
NSMutableArray * yCoordArray = [[NSMutableArray alloc] init];
for (int i = 1; i <= userInputCount; i++){
int xCoord;
int yCoord;
printf("(%i) Enter coordinates [X,Y]: ", i);
scanf("%i,%i", &xCoord, &yCoord);
NSNumber *xCoordinate = [[NSNumber alloc] initWithInt:xCoord];
NSNumber *yCoordinate = [[NSNumber alloc] initWithInt:yCoord];
[xCoordArray addObject:xCoordinate];
[yCoordArray addObject:yCoordinate];
}

After working on it for a while I figured it out if anybody is trying the same thing
for (int j = 0; j < 2; j++){
for (int i = 0; i < [yCoordArray count] - 1; i++){
int yExchangeIntOne = [[yCoordArray objectAtIndex:i] intValue];
int yExchangeIntTwo = [[yCoordArray objectAtIndex:i +1] intValue];
if (yExchangeIntOne > yExchangeIntTwo){
[yCoordArray exchangeObjectAtIndex:i+1 withObjectAtIndex:i];
i = 0;
}
int xExchangeIntOne = [[xCoordArray objectAtIndex:i] intValue];
int xExchangeIntTwo = [[xCoordArray objectAtIndex:i +1] intValue];
if (xExchangeIntOne > xExchangeIntTwo){
[xCoordArray exchangeObjectAtIndex:i+1 withObjectAtIndex:i];
i = 0;
}
}
}
This goes right after the
[xCoordArray addObject:xCoordinate]; and the
[yCoordArray addObject:yCoordinate]; in the loop

Related

how to check all object in NSMutableArray same value

I have on NSMutableArray like this:
NSMutableArray *array = [NSMutableArray arrayWithObjects:#"0",#"0",#"0",#"0",#"0", nil];
now I want check if all object in my array are to same and equal to 0 doing certain work!!!. but I don't know about this.
please guide me.
My friend try this:
NSMutableArray *array = [NSMutableArray arrayWithObjects:#"0",#"0",#"0",#"0",#"0", nil];
NSCountedSet *filter = [NSCountedSet setWithArray:array];
//this condition check number of 0 value with your array count
//if number of 0 equal to array count this means that all object in array is 0
if ([filter countForObject:#"0"] == [array count]) {
NSLog(#"all objects are 0");
}
You can use the usual for statement:
for (int i = 0; i < [array count]; i++)
{
NSString *string = [array objectAtIndex:i];
// Check for >0
}
Or fast enumeration:
for (NSString *string in array)
{
// Check for >0
}
I didn't fill on purpose the check part, considering that you are a iOS (i guess) beginner can i recommend a good book on iOS programming? iOS Programming: The Big Nerd Ranch Guide

Cannot access UIBezierPath in a NSMutable array

so I have a [NSMutableArray *paths] that contains UIBezierPaths that correspond to each separate path drawn on the screen. I also have another NSMutable array colors that contains the corresponding color for the path. The problem that I am having is that although the two arrays are mutating and I can see the count of both going up, the following drawRect method only seems to draw the last path in the array.
I have scoured through a lot of questions and based on what I have read so far, this very problem seems to get us newbies and mostly because of type mismatch. I even tried to Typecast the return and it was futile.
Here is my code from the drawRect
int cnt = paths.count;
if (cnt != 0)
{
for(int i = 0; i < cnt; i++)
{
NSLog(#"Drawing path:%i", i);
UIColor *color;
color = [colors objectAtIndex:i];
[color setStroke];
UIBezierPath *path = [paths objectAtIndex:i];
path.lineWidth = 2;
[path stroke];
}
}
every time I call [self setNeedsDisplay] it wipes out my entire screen.
Am I correct in assuming that I am not handling my
UIBezierPath *path = [paths objectAtIndex:i];
well?
Thank you very much and in advance.
UPDATE:
I was rummaging through some more codes and now it almost looks like there is another possibility that ARC is releasing the contents of my NSMutable array. I tried the do the following and got a compiler error.
[paths retain];
Besure you add your path to your path array afer each draw
- (void)drawRect:(CGRect)rect {
[brushPattern setStroke];
UIBezierPath *drawPath = [UIBezierPath bezierPath];
drawPath.lineCapStyle = kCGLineCapRound;
drawPath.miterLimit = 0;
drawPath.lineWidth = thisLineWidth;
for (UIBezierPath *path in pathArray)
[drawPath appendPath:path];
UIBezierPath *path = [self pathForCurrentLine];
if (path)
[drawPath appendPath:path];
[drawPath stroke];
}
- (UIBezierPath*)pathForCurrentLine {
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:startPoint];
[path addLineToPoint:endPoint];
return path;
}

How to check for duplicate strings in an NSMutableArray

I have an NSMutableArray that I'd like to check for duplicate strings. I don't need to know what the strings are, just if there are any duplicates.
I'm thinking add the answers to an NSSet, then check to see if the number of entries is different than the original array. Is there a better way to do this?
Here is the code to see duplicates values
for(int j = 0; j < [myMutableArray count]; j++){
for( k = j+1;k < [myMutableArray count];k++){
NSString *str1 = [myMutableArray objectAtIndex:j];
NSString *str2 = [myMutableArray objectAtIndex:k];
if([str1 isEqualToString:str2])
NSLog(#"duplicate value is %#",[myMutableArray objectAtIndex:k]);
}
}

how do you disable a button based on a tag?

i need assistance with this code. not sure how to write a code to disable/enable the button based on a tag.
i tried to use "[levelMenu setIsEnabled:false];" but all the buttons are disabled.
//in my init method
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:#"texture.plist"];
CCSpriteBatchNode *colorSprites = [CCSpriteBatchNode batchNodeWithFile:#"texture.png"];
[self addChild:colorSprites];
CCMenu *myMenu = [CCMenu menuWithItems:nil];
int rows = 2;
int cols = 4;
static int padding=20;
for(int count=0; count < (rows*cols); count++) {
int index1 = count +1;
NSString *spritefiles1 = [NSString stringWithFormat:#"sprite%d.png", index1];
random1 = [CCSprite spriteWithSpriteFrameName:spritefiles1];
CCMenuItemSprite *levelMenu = [CCMenuItemSprite itemFromNormalSprite:random1 selectedSprite:[CCSprite spriteWithFile:#"Iconselected.png"] disabledSprite:[CCSprite spriteWithFile:#"Iconlocked.png"] target:self selector:#selector(levelSelected:)];
int yOffset = padding+(int)(random1.contentSize.width/2-((random1.contentSize.width+padding)*(count/rows))); // or /cols to fill cols first
int xOffset = padding+(int)(random1.contentSize.width/2+((random1.contentSize.width+padding)*(count%rows))); // or %cols to fill cols first
levelMenu.position = ccp(xOffset, yOffset);
levelMenu.tag = count+1;
myMenu.position =ccp(0,300);
[myMenu addChild:levelMenu];
//testing to disable the button
// [levelMenu setIsEnabled:false];
}
-(void) levelSelected:(CCMenuItemSprite*) sender {
int level = sender.tag;
NSLog(#"test button number %d",level);
}
You may want to read this post
In Cocos2d, with buttons on multiple layers, how can I control which button to react to user's touch?
I tried, it worked for me
[_fireButton setIsEnabled:NO];

Programmatically create a grid of UIViews (or any object with a view)

I'm making a game where a grid that is x by y square views big. What I'd like to do is be able to create the grid programmatically.
I had something along these lines in mind.
int across = x
int down = y
CGRect dimentions = foo, bar //etc
int distanceBetween = z
///some crazy loop to make it
If possible I'd also like to keep a reference to each, ideally by assigning tags so I can manipulate them later..
Cheers
S
I think this should do the trick
int across = x
int down = y
CGSize dimensions; // make a cgsize here with the correct values
int distanceBetween = z;
NSMutableArray *views = [[NSMutableArray alloc] init];
for (int x = 0; x < across; x++) {
NSMutableArray *downViews = [[NSMutableArray alloc] init];
for (int y = 0; y < down; y++) {
UIView *view; //create view using the dimensions and padding
//any additional setup to the views
[downViews addObject:view];
}
[views addObject:downViews];
[downViews release];
}
Basically it's just a matter of setting the grid sizes and then calculating the x and y positions from there.
It should calculate how many columns across based on the frame size. So that if the frame widens it will show more columns. Not sure if you need it to be resolution independent or not but I've put that in there.
If you need a set number of columns in the grid then just change gridColumns to be a fixed integer.
float gridItemWidth = 225.00;
float gridItemHeight = 225.00;
-(int)gridColumns {
NSRect frame = [self frame];
return (int)frame.size.width / (gridItemWidth);
}
-(int)getxOffset:(int)i {
int xPadding = 10;
return ((i % [self gridColumns]) * (gridItemWidth + xPadding));
}
-(int)getyOffset:(int)i {
int yPadding = 20;
return (floor(i / [self gridColumns]) * (gridItemHeight + yPadding));
}
Then basically in your loop you call getxOffset and getyOffset for the index of your loop to get the position of the grid.
I have manually set the x and y paddings in there to be 10 and 20, but you can set them to whatever you need.

Resources