Dont add NSMutabledictionary values in alphabetical order - ios

I am trying to add datas to a dictionary using key value array but the dictionary values are arranged based on keys alphabetical order
my values and keys array contains :
myValueArray ={[orange,apple],
[ford,toyota,lexus]}
myKeyArray ={[fruits],[cars]}
I am adding keys and value to a NSMutabledictionary using
myDictionary = [[NSMutableDictionary alloc]initWithObjects:myValueArray forKeys:MainDelegate.myKeyArray];
myDictionary should be
myDictionary = { Fruits =(orange,apple);
cars =(ford,toyota,lexus);}
but it is added in key's alphabetical order and looks like
myDictionary = { cars =(ford,toyota,lexus);
Fruits =(orange,apple);}
is there a way to add key value pairs in dictionary as it is without any ordering.
I am trying this to populate a grouped uitableview. since keys are used as sections everything looks like contacts app where sections and its corresponding values are arranged alphabetically. But i need the recent section to be shown first(the first one in array).

If you need to conserve your initial order, then you have to use an NSMutableArray.
NSMutableDictionary is designed to be able to access the values for key in the fastest possible way, and having the key sorted helps with that.
Here is how to declare the dictionary and array and how to use them for a grouped tableView:
NSDictionary *myDictionary = #{ #"cars": #[#"ford" , #"toyota", #"lexus"], #"Fruits": #[#"orange", #"apple"]};
NSArray *keysArray = #[ #"Fruits", #"cars"];
// first section
NSString *sectionName = keysArray[0];
NSArray *sectionArray = myDictionary[sectionName];
// second section
sectionName = keysArray[1];
sectionArray = myDictionary[sectionName];

NSMutableDictionary doesn't have any sorting associated to it, when you print this in log, it will display in sorting order.
You can manage a separate NSMutableArray and put you key in the order in which you want to fetch from NSMutableDictionary.
That can be the easiest way to store values and fetch as per your requirement.
May this help you.

Related

How to store objects at two different indexes of one NSArray to one index of another NSArray

I have an NSArray mentioned below.
a{
some objects
}
b{
some objects
}
c{
some objects
}
I would like to know if there is any way to store a,b index into one index in another NSArray ?
First convert your NSArray to NSMutableArray in which you wants to add element and then
Put both object form other array In a NSMutableDictionary for particular keys and then add NSMutableDictionary to object desired index in NSMutableArray.
You need to find these two object add them to the new NSArray(it will have 2 objects inside) and add this array to an another array at index 0 as you want

ObjectiveC-NSMutable array specific indexes stored in another array

Is there anyway I can add specific objects in NSMutableArray to another array in objective c? I can accomplish that in Java but cannot figure it our for objective c
For example I have an array of 7 strings and I only want indexes 1, 3 ,7 stored in another array.
Here is one way of creating the array from the string values at particular indexes:
NSMutableArray *array = ...; // Array with strings
NSArray *someOtherArray = #[ array[1], array[3], array[7] ];
So both array[1] and someOtherArray[0] point to the same (NSString) instance, etc.
This is what NSIndexSet (and NSMutableIndexSet) is for.
You can build it manually or use helper methods on NSArray like:
indexesOfObjectsPassingTest:
to build an index set from a block. You can then enumerate over the NSIndexSet using a for loop - using the index to call into the original array.

How to change one value in NSMutableDictionary

I have a NSMutableDictionary with one key and it has the following values.
How can I change the value in item2 from 1 to 0? That's the only change I need.
The only way I have found is to recreate this whole key from scratch, change that one value and then delete that key and replace it with a new one. Is there any easier solution than that?
I will assume you get dict as an instance of NSMutableDictionary somehow:
NSMutableArray *tmp = [dict[#"07:00 AM.infoKey"] mutableCopy];
tmp[2] = #"0";
dict[#"07:00 AM.infoKey"] = tmp;
Unfortunately with nested arrays in dictionaries, the arrays aren't automatically mutable so there isn't any better method to doing so, like you observed.

Saving IOS dictionary with arrays as keys

i am working with Tapku's Calendar, and i want to save some values that will be user inputed.
But i am kind of stumbled on how i would achive this, here is the layout:
// allocate the arrays and dictionary
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSMutableArray *dateValueArray = [[NSMutableArray alloc] init];
// set array values
[dateValueArray addObject:#"first string"];
[dateValueArray addObject:#"Second string"];
// set dictionary with date as key, and array as value
[dict setObject:dateValueArray forKey:testdate];
The dictionary dict, will be the only Dictionary, but since that dictionary uses arrays for objects, i would have multiple arrays.
So, lets say there are multiple dates registerd in "dict", different keys would have to use different arrays? Sorry i am abit confused my self here.
Is there any way i can use 1 array to store all the strings associated with different dictionary keys ?
EDIT 1
Elaboration:
The whole idea is that the user can input text that are associated with dates.
I will need to store these values and i will need to store which date they are associated to.
So i have multiple values in an array, associated with 1 date in a dictionary.
And keeping in mind that i will have to store this, i would like to know how i should assign the values to the dates.
EDIT 2:
Basically what i need for the Array is something like AddObject ForKey
Edit 3
More elaboration::
Basically i want to access the values in this manner:
[date1][note1]
[date1][note2]
[date2][note1]
[date2][note2]
And the amount of values in both date and note are variable.
If I understand what you are asking about, what you want is the property of NSDictionary allKeys which is an array of all the keys in that dictionary.
Now I see your edit. You are in the right way. To perform what you are looking for, do something like this:
First, allocate your dict somewhre:
// allocate the arrays and dictionary
NSMutableDictionary *dict = [NSMutableDictionary new];
Now, everytime you get a new date with a new string, first check if there's the first string for that date. If yes, create a new array. If not, add your string inside the previously array.
NSMutableArray *valuesForDate = dict[givenDate];
if (!valuesForDate)
{
valuesForDate [NSMutableArray new];
dict[givenDate] = valuesForDate
}
[valuesForDate addObject:#"first string for dateGiven"];
[valuesForDate addObject:#"Second string for dateGiven"];
Now you can retrieve the values with something like you wanted:
NSString *test = dict[date1][0]; //first string associated for date1
NArray *allStringsForDate2 = dict[date2]; //array with all the strings for date2
You can try using NSMapTable instead of NSDictionary, which is much more flexible but also much harder to use. You'll also find it hard to find anyone knowing the answers if you have questions about NSMapTable. But you can definitely create an NSMapTable which will use pointers of objects as keys, instead of the values.

What is the best way to get at nested dictionaries from a third party plist?

I have a IOS plist generated by a third party's app I am trying to interface to, consequently I cannot modify the format of the plist. The part that is giving me trouble is an array of Dictionaries, the cardList array. I have loaded the plist into a NSMutableDictionary with no problem and can 'dump' the cardList and colorLabelList arrays.
First Question: What is the best way to access each member of the Item array's? i.e., draft, label, etc. for each of the cards in the list.
2nd Question: Is my 'loading into a NSMutableDictionary' approach the best choice?
Here is the layout of the plist:
cardlist Array
item 0 Dictionary
draft boolean
label string
notes string
...
item 1 Dictionary
draft
label
notes
...
name string
sortOrder number
Use NSMutableDictionary only if you are actually going to change the data, otherwise use a standard NSDictionary (this is more of style thing, the actual implementation does not really change).
If you want to cycle through the cardlist array, do the following:
//This will enumerate through the array element by element
for (NSMutableDictionary *dictionary in cardlist) {
//Ok, now we have a dictionary from cardlist
//Let's print the items to the console
NSLog(#"draft: %i", [dictionary valueForKey:#"draft"]); //Note, there are better ways print print a bool to the log, but this will work for now
NSLog(#"label: %#", [dictionary valueForKey:#"label"]);
NSLog(#"notes: %#", [dictionary valueForKey:#"notes"]);
}
That should go through all of your cardlist array and print the values.

Resources