finding the maximum date from an array in objective c - ios

i have a mutable array with objects as dates,now i want to get the maximum date from an array..i tried like this
NSMutableArray *arrDates = [[NSMutableArray alloc]init];
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:#"yyyy-MM-dd"];
for (int i = 0; i<dateArray2.count; i++)
{
[arrDates addObject:[df dateFromString:dateArray2[i]]];
}
NSLog(#"%#",arrDates);
NSDate *maxDate=[arrDates valueForKeyPath:#"#max.date"];
NSLog(#"max date is %#",maxDate);
}
while executing app has got terminate..can any one help me...thanks in advance

Since you are already iterating the input array, there is no need to build an array of dates; simply keep track of the latest date in the first array:
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:#"yyyy-MM-dd"];
NSDate *latestDate = [df dateFromString:dateArray2[0]];
for (int i = 1; i<dateArray2.count; i++)
{
NSDate *compareDate = [df dateFromString:dateArray2[i]];
latestDate = [latestDate laterDate:compareDate];
}
NSLog(#"max date is %#",maxDate);

You can use,
NSDate *maxDate = [dateArray valueForKeyPath:#"#max.self"];
This will give you the largest date from array.
read more https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html

NSMutableArray *arrDates = [[NSMutableArray alloc]init];
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:#"date"
ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
arrDates = [[dateArray2 sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
NSString *maxdate=[arrDates objectatindex:0];
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:#"date"
ascending:NO];
in this line #"date" is your key in array

Related

how to sort array of dates in ascending order in ios

I have a NSMutableArray that contains dates in string format. Here I need to sort that array in order of ascending order of dates. I used strong text
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:#"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];
But it only sort the dates in terms of ascending order of day and month. Year is not considered. Please help me.
For example, Array contains
03/09/2017, 03/06/2016, 01/06/2016,01/04/2016 and 03/01/2017.
After using the above lines of code, Array contains like,
01/04/2018, 01/06/2016, 03/01/2017, 03/06/2016, 03/09/2016
You need to use sortedArrayUsingComparator like this way to sort date with String array.
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MM/dd/yyyy"];
NSArray *sortedArray = [yourArray sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
NSDate *d1 = [df dateFromString: obj1];
NSDate *d2 = [df dateFromString: obj2];
return [d1 compare: d2];
}];
Note : Set formate of date According to your date, it is hard to predicate date formate from your example thats why I have used MM/dd/yyyy, if your date contain formate dd/MM/yyyy then use that.
your code is correct but date format wrong.
try this code:
NSMutableArray *dateArray = [[NSMutableArray alloc] initWithArray: #[#"03/09/2017", #"03/06/2016", #"01/06/2016",#"01/04/2016", #"03/01/2017"]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSDate *date;
for (int i = 0; i < dateArray.count; i++) {
[formatter setDateFormat:#"MM/dd/yyyy"]; // Please your date format set.
date = [formatter dateFromString:[dateArray objectAtIndex:i]];
[formatter setDateFormat:#"yyyy/MM/dd"];
[dateArray replaceObjectAtIndex:i withObject:[formatter stringFromDate:date]];
}
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:#"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];
NSLog(#"Array: %#",reverseOrder);
Please try below code:
NSArray *strDateArray = [[NSArray alloc] initWithObjects:#"03/09/2017",#"03/06/2016", #"01/06/2016",#"01/04/2016",#"03/01/2017", nil];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:#"MM/dd/yyyy"];
NSMutableArray *dateArray = [[NSMutableArray alloc] init];
for (NSString *dateString in strDateArray) {
NSDate *date = [formatter dateFromString:dateString];
[dateArray addObject:date];
}
// sort array of dates
[dateArray sortUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {
// return date1 compare date2 for ascending. And reverse the call for ascending.
return [date1 compare:date2];
}];
NSLog(#"dateArray %#", dateArray);
NSMutableArray *sortedDateArray = [[NSMutableArray alloc] init];
for (NSDate *date in dateArray) {
NSString *dateString = [formatter stringFromDate:date];
[sortedDateArray addObject:dateString];
}
NSLog(#"sortedDateArray %#", sortedDateArray);
For Swift 4.0
let formater = DateFormatter()
formater.dateFormat = "MM/dd/yyyy" //date formate should be according to your date formate
let sortedArray=arrayToSort.sorted(){
(obj1, obj2) in
let date1=formater.date(from: obj1)
let date2=formater.date(from: obj2)
return date1!<date2!
}
//You can change the date format according to your code
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MM/dd/yyyy"];
NSArray *sortedArray = [YourArraysortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2)
{
NSString *strDateObj1 = [NSString stringWithFormat:#"%#",[obj1 valueForKey:#"BirthDate"]];
NSString *strDateObj2 = [NSString stringWithFormat:#"%#",[obj2 valueForKey:#"BirthDate"]];
NSDate *d1 = [df dateFromString: strDateObj1];
NSDate *d2 = [df dateFromString: strDateObj2];
return [d1 compare: d2];
}];
NSLog(#"%#", sortedArray)

How to sort Dates in objective C?

In my app I am bookmarking the words in different days, I have the sorting options such as sort recent first and oldest first. I am unable to sort the words according to the bookmarked date, How to do it? By using Descriptors my sorting is not fine as only the first two entries are getting sorted. My code is:
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:#"cellType" ascending:NO selector:#selector(localizedCaseInsensitiveCompare:)];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:#"entrydate" ascending:NO selector:#selector(localizedCaseInsensitiveCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil];
[self.favoriteEntries sortUsingDescriptors:sortDescriptors];
[[NSUserDefaults standardUserDefaults] setValue:#"descendingDate" forKey:#"BookmarkSortType"];
You can use bubble sort.It will give you exact result without any confusion.Yes , the line of codes are more than predefined function but it will be correct to use bubble sort.
Try like this:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"MM/dd/yyyy HH:mm:ss a"];//SET_YOUR_DATE_FORMAT
NSString *updatedDateStr1 = YOUR_FIRST_DATE_STRING;
NSDate *date1 = [dateFormatter dateFromString:updatedDateStr1];
NSString *updatedDateStr2 = YOUR_SECOND_DATE_STRING;
NSDate *date2 = [dateFormatter dateFromString:updatedDateStr2];
NSComparisonResult result = [date2 compare:date1];//THIS WILL RETURN ONE OF NSOrderedAscending , NSOrderedSame, NSOrderedDescending
Looks like you have NSString Object. you need to convert it in NSDate object then compare using Predicate and sort as per your need. Modify obj whatever you have in your dictionary or array.
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:#"yyyy-MM-dd"];// Whatever your current stringDate format.
[df setTimeZone:[NSTimeZone systemTimeZone]];
NSPredicate *findFutureDates = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){
NSDate *dd = [df dateFromString:(NSString *)obj ];
return ([[NSDate date] compare:dd] == NSOrderedAscending);
}];
NSArray *arrFutureDates = [yourArray filteredArrayUsingPredicate: findFutureDates];
NSLog(#"%#",arrFutureDates);
Maybe this will help you.

Sort objects based on a NSString date

I have an array of objects which all contain a expectedDeliveryDate string. I have a method which takes a date string and turns it into a NSDate.
How can I sort these in ascending or descending order?
I am assuming that you have an Array in which each object is Dictionary and it contains data of delivery
try this I create this method in my project to sort array with Key.
In this method lastDescriptor has selector compare: so two date will compare and sort automatically in this method.
-(NSMutableArray *)sortArrayWithKey:(NSString *)sortingKey andArray:(NSMutableArray *)unsortedArray{
NSSortDescriptor *lastDescriptor = [[NSSortDescriptor alloc] initWithKey:sortingKey ascending:NO selector:#selector(compare:)];
NSArray *descriptors = [NSArray arrayWithObjects: lastDescriptor, nil];
return [unsortedArray sortedArrayUsingDescriptors:descriptors].mutableCopy;
}
Hope this help you too..
Sorting the array with NSString date.
Things Done:
Convert the array which has NSString Date to NSDate
Then sort the array with NSDate.
Try this
NSMutableArray *oldArray; //Array which consist of object with date as string.
NSMutableArray *newArray = [[NSMutableArray alloc] init];
if(oldArray.count!=0){
//CONVERT STRING TO DATE
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM d, yyyy"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:#"GMT"]];
for (int i=0 ;i<oldArray.count;i++)
{
NSMutableDictionary *dict= [oldArray objectAtIndex:i];
NSString *stringDate = [dict objectForKey:#"stringDateKey"];
if(![stringDate isEqualToString:#""]){
NSDate *date = [dateFormat dateFromString:stringDate];
NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init];
[newDict addEntriesFromDictionary:dict];
[newDict setObject:date forKey:#"newDate"];
[newArray addObject:newDict];
}
else{
[newArray addObject:dict];
}
}
//SORTING THE ARRAY
NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:#"newDate" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, nil];
NSArray *sortedArray = [dataValue sortedArrayUsingDescriptors:sortDescriptors];
}
+ (void)filterAlertsByTime:(NSMutableArray*)alerts {
NSDateFormatter *hourFormatter = [[NSDateFormatter alloc] init];
[hourFormatter setDateFormat:#"MM/dd/yyyy hh:mm a"];
[alerts sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSDate *date1 = [hourFormatter dateFromString:[NSString stringWithFormat:#"%#",obj1[#"expectedDeliveryDate"]]];
NSDate *date2 =[hourFormatter dateFromString:[NSString stringWithFormat:#"%#",obj2[#"expectedDeliveryDate"]]] ;
return [date1 compare:date2];
}];
}
Please edit the date format according to the format of the expectedDeliveryDate string
You can use sort descriptors to sort objects by their dates. So first convert your strings to NSDates and set them on another property of your custom object, and sort them that way.
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:#"expectedDeliveryDate"
ascending:YES];
NSArray *sortedDeliverDates = [deliveryItems sortedArrayUsingDescriptors:#[descriptor]];
Furthermore NSDate also has a compare: method that will let you compare two dates.

How to convert NSArray to NSDate

I am having an array which having a date. I want to convert the array into NSDate. Then converted NSDate are stored in an another array.This is my array.
uniqueItems (
"2015-02-17",
"2015-02-09",
"2015-02-02",
"2015-01-27",
"2015-01-19",
"2015-01-12"
)
How to convert this array to NSDate, And store in to another array. Help me in coding.
Suppose you have an array as below:
NSArray *ary = [NSArray arrayWithObjects:#"2015-02-17",#"2015-02-09",#"2015-02-02", nil];
To convert each string into date:-
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:#"dd-MM-yyyy"];
for(int i =0;i<ary.count;i++){
NSDate *d = [[NSDate alloc]init];
d = [dateFormatter dateFromString:ary[i]];
}
If you want to use NSDateFormate, you can also use in loop also.
First convert your NSString to NSDate
NSArray *arrr = #[ #"2015-02-17",
#"2015-02-09",
#"2015-02-02",
#"2015-01-27",
#"2015-01-19",
#"2015-01-12"];
NSMutableArray *arrDates = [[NSMutableArray alloc]init];
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:#"yyyy-MM-dd"];
[df setTimeZone:[NSTimeZone systemTimeZone]];
for (int i = 0; i<arrr.count; i++) {
[arrDates addObject:[df dateFromString:arrr[i]];;
}
NSLog(#"%#",arrDates);
now sort array for dates because your array contains NSDate Objects. you don't have key so do not pass any key
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
sortDescriptorWithKey:#""
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedDateArray = [arrDates sortedArrayUsingDescriptors:sortDescriptors];
NSLog(#"%#",sortedDateArray);
I can understand as you are a newbie,Follow these steps but remember to get the understanding first:-
1.Enumerate your array to get all the strings(dates for your understanding),and add those to another array you want, like this:-
for (NSString *dateString in yourArrayofDates) {
NSDate *date=[self getDateFromDateString:dateString];
[yourAnotherDateArray addObject:date];
}
2.Add a method to get the NSDate from your string,like this:-
-(NSDate *)getDateFromDateString :(NSString *)dateString {
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:#"yyyy-MM-dd"];
NSDate *date = [dateFormatter dateFromString:dateString];
return date;
}

Sorting array based on date and time with two dictionary keys

I am trying to sort an array based on date and time , I can successfully sort the array based on date both time is coming as another value in dictionary.
So date comes as a string in format "yyyy-MM-dd" and time comes in as a string in format "HH:mm"
Time value comes in key "starts" as string '"HH:mm"' format.
I know somehow I need to combine two strings to 'yyyy-MM-dd HH:mm' but how?
-(NSMutableArray *)sortArrayBasedOndate:(NSMutableArray *)arraytoSort
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:#"yyyy-MM-dd"];
NSComparator compareDates = ^(id string1, id string2)
{
NSDate *date1 = [formatter dateFromString:string1];
NSDate *date2 = [formatter dateFromString:string2];
return [date1 compare:date2];
};
NSSortDescriptor * sortDesc1 = [[NSSortDescriptor alloc] initWithKey:#"start_date" ascending:YES comparator:compareDates];
[arraytoSort sortUsingDescriptors:[NSArray arrayWithObjects:sortDesc1, nil]];
return arraytoSort;
}
Any idea how can I solve this problem?
You need to sort the times as well, that is why sortUsingDescriptors: takes an array.
-(NSMutableArray *)sortArrayBasedOndate:(NSMutableArray *)arraytoSort
{
NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
[fmtDate setDateFormat:#"yyyy-MM-dd"];
NSDateFormatter *fmtTime = [[NSDateFormatter alloc] init];
[fmtTime setDateFormat:#"HH:mm"];
NSComparator compareDates = ^(id string1, id string2)
{
NSDate *date1 = [fmtDate dateFromString:string1];
NSDate *date2 = [fmtDate dateFromString:string2];
return [date1 compare:date2];
};
NSComparator compareTimes = ^(id string1, id string2)
{
NSDate *time1 = [fmtTime dateFromString:string1];
NSDate *time2 = [fmtTime dateFromString:string2];
return [time1 compare:time2];
};
NSSortDescriptor * sortDesc1 = [[NSSortDescriptor alloc] initWithKey:#"start_date" ascending:YES comparator:compareDates];
NSSortDescriptor * sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:#"starts" ascending:YES comparator:compareTimes];
[arraytoSort sortUsingDescriptors:#[sortDesc1, sortDesc2]];
return arraytoSort;
}
Concatenate both to one timestamp. Then get the TimeInterVal since ref date,
and sort by this number

Resources