2012-01-12 25 views
4

配列内の最も早い日付と最新の日付を決定するコードに多くの問題があります。私が使用しているコードは次のとおりです。NSDatesを比較して配列の中で最も古い日付と最新の日付を見つけるにはどうすればいいですか?

NSDate *startDate = nil; // Earliest date 
NSDate *endDate = nil; // Latest date 

for (id entry in myArray) 
{ 
    NSDate *date = [entry objectForKey:kDate]; 

    if (startDate == nil && endDate == nil) 
    { 
     startDate = date; 
     endDate = date; 
    } 
    else if ([date compare:endDate] == NSOrderedAscending) 
    { 
     startDate = date; 
    } 
    else if ([date compare:startDate] == NSOrderedDescending) 
    { 
     endDate = date; 
    } 

    date = nil; 
} 

私が間違っている場所で働くのを助けることができる人はいますか?

+2

あなたは間違っていますか? – Mark

答えて

7

確かにstartDateendDateは、else ifステートメントの間違った方法で設定していますか?

また
NSDate *startDate = nil; // Earliest date 
NSDate *endDate = nil; // Latest date 

for (id entry in myArray) 
{ 
    NSDate *date = [entry objectForKey:kDate]; 

    if (startDate == nil && endDate == nil) 
    { 
     startDate = date; 
     endDate = date; 
    } 
    if ([date compare:startDate] == NSOrderedAscending) 
    { 
     startDate = date; 
    } 
    if ([date compare:endDate] == NSOrderedDescending) 
    { 
     endDate = date; 
    } 

    date = nil; 
} 
+0

'date'と' endDate'の比較は 'date'と' startDate'の比較結果とは関係がないので、 'else'も削除しなければなりません。おそらく両方を取り除くでしょう。 –

+0

イックはい私は完全にそのビットを光沢。それに応じて編集。 – mattjgalloway

+0

もう一度考えて、 'else'を入れてください。(' date'は 'endDate'の後と' startDate'の前の両方にできません!) – CRD

11

あなたが方法でNSDatesNSArrayを並べ替えることができます:あなたは、これはしたくないだろうに[array firstObject]

array = [array sortedArrayUsingSelector:@selector(compare:)]; 

そして、最初の日付を(たとえば1970-01-01T00:00:00) 、そして最後のオブジェクト:[array lastObject]は最後の日になります(例:2011-01-12T00:00:00)

3

またのための余分なチェックを避けるために、事前に定義されたdistantPastdistantFuture定数を使用することができます0:

NSDate *startDate = [NSDate distantFuture]; 
NSDate *endDate = [NSDate distantPast]; 

for (id entry in myArray) 
{ 
    NSDate *date = [entry objectForKey:kDate]; 

    if ([date compare:startDate] == NSOrderedAscending) { startDate = date; } 
    if ([date compare:endDate] == NSOrderedDescending) { endDate = date; } 

    date = nil; 
} 
2

またearlierDate:laterDate: NSDateはただ、他の同様の問題のため

 
NSDate *startDate = [NSDate distantFuture]; 
NSDate *endDate = [NSDate distantPast]; 

for (id entry in myArray) 
{ 
    NSDate *date = [entry objectForKey:kDate]; 
    startDate = [startDate earlierDate:date]; 
    endDate = [endDate laterDate:date]; 
} 
0

を機能使用できます。

[myArray valueForKeyPath:@"@min.self"]; 
[myArray valueForKeyPath:@"@max.self"]; 

これは前提としていますvalueForKeyPath:オプションは、私が考える非常に巧妙です配列内のオブジェクトは、あなたが望む方法でcompare:メソッドを実装します。私は、たとえば、日付の配列で最も早い日付を取得するために使用します。ここで使用したい場合は、配列内のオブジェクトはcompare:メソッドをオーバーライドする必要があります。

関連する問題