2010-11-30 26 views
1

Array nach Datum sortieren, Problem ist im String-Format gespeichertes Datum ist es möglich, Array ohne Änderungsdatum im NSDate-Objekt zu sortieren (Core Data).Array nach Datum sortieren

String-Format tt/mm/jjjj

+0

Was ist das String-Format - geben Sie ein Beispiel! – deanWombourne

+0

Sind diese Daten in gewöhnlichen Objekten in einem Array gespeichert oder handelt es sich um verwaltete Objekte in einem Core Data-Diagramm? – TechZen

+0

Es ist Core Data Entities und nur Möglichkeit, Datumszeichenkette mit zu verwenden. Operator mit dem Objekt der Kerndateneinheit. – Ishu

Antwort

1
-(NSMutableArray *)sortByStringDate:(NSMutableArray *)unsortedArray 
{ 
    NSMutableArray *tempArray=[NSMutableArray array]; 
    for(int i=0;i<[unsortedArray count];i++) 
    { 

     NSDateFormatter *df=[[NSDateFormatter alloc]init]; 
     objModel=[unsortedArray objectAtIndex:i]; 

     [df setDateFormat:@"MM/dd/yyyy"]; 
     NSDate *date=[df dateFromString:objModel.sDate]; 
     NSMutableDictionary *dict=[NSMutableDictionary dictionary]; 
     [dict setObject:objModel forKey:@"entity"]; 
     [dict setObject:date forKey:@"date"]; 
     [tempArray addObject:dict]; 
    } 

    NSInteger counter=[tempArray count]; 
    NSDate *compareDate; 
    NSInteger index; 
    for(int i=0;i<counter;i++) 
    { 
     index=i; 
     compareDate=[[tempArray objectAtIndex:i] valueForKey:@"date"]; 
     NSDate *compareDateSecond; 
     for(int j=i+1;j<counter;j++) 
     { 
      compareDateSecond=[[tempArray objectAtIndex:j] valueForKey:@"date"]; 
      NSComparisonResult result = [compareDate compare:compareDateSecond]; 
      if(result == NSOrderedAscending) 
      { 
       compareDate=compareDateSecond; 
       index=j; 
      } 
     } 
     if(i!=index) 
      [tempArray exchangeObjectAtIndex:i withObjectAtIndex:index]; 
    } 


    [unsortedArray removeAllObjects]; 
    for(int i=0;i<[tempArray count];i++) 
    { 
     [unshortedArray addObject:[[tempArray objectAtIndex:i] valueForKey:@"entity"]]; 
    } 
    return unsortedArray; 

} 

Das funktioniert für mich.

0

ist, wenn das Datum in einem Format gespeichert wird, in dem eine alphabetische Sortierung zu einem Datum sortiert äquivalent ist, dann kann es nicht mit Kerndaten durchgeführt werden. In diesem Fall haben Sie zwei Optionen:

  • Fügen Sie Ihrer Datenbank ein neues NSDate-Attribut hinzu und konvertieren Sie jedes Textdatum in ein reales Datum und aktualisieren Sie den Datensatz. Dann können Sie mit den Kerndaten sortieren
  • Extrahieren Sie alle Daten in ein In-Memory-Array, dann sortieren Sie das mit einer benutzerdefinierten Vergleichsmethode.
  • 1

    Sie können die Sortierung mit sortDescriptorWithKey:ascending:comparator: erstellen und einen Block bereitstellen, der zwei beliebige Ihrer Datumszeichenfolgen vergleicht. Verfügbar in iOS 4.0 und höher.

    +0

    muss für alle Versionen arbeiten.und wie kann ich + (id) sortDescriptorWithKey: (NSString *) Taste aufsteigend: (BOOL) aufsteigender Komparator: (NSComparator) cmptr – Ishu

    +0

    Wie kann ich dies implementieren. – Ishu

    1

    Der Weg dorthin ist die Verwendung der NSArray-Methode -sortedArrayUsingFunction:context:. Dies funktioniert in iOS 2.0 und höher und ist ziemlich einfach. Sie nennen würde:

    sortedArray = [unsortedArray sortedArrayUsingFunction:sortByStringDate context:NULL]; 
    

    Und Sie werden die Funktion wie so definieren müssen:

    NSInteger sortByDateString(id string1, id string2, void *context) 
    { 
        int y1 = [[string1 yearComponent] intValue]; 
        int y2 = [[string2 yearComponent] intValue]; 
        if (y1 < y2) 
         return NSOrderedAscending; 
        else if (v1 > v2) 
         return NSOrderedDescending; 
        else 
         int m1 = [[string1 monthComponent] intValue]; 
         int m2 = [[string2 monthComponent] intValue]; 
         if (m1 < m2) 
          return NSOrderedAscending; 
        // et cetera 
    } 
    

    Sie werden Ihre eigene Logik brauchen das Jahr, den Monat zu trennen, und das Datum der Zeichenfolge so dass Sie jeden vergleichen können. Ich bin mir nicht sicher, ob das weniger Arbeit ist, als die Strings in Daten zu konvertieren, wie es Dennis vorgeschlagen hat, aber Sie kennen Ihr Programm, also auch das, das funktioniert.

    +0

    Es kann funktionieren, aber es hat mehr Overhead. Wenn keine Lösung ich werde dann nehme ich dieses ein. – Ishu

    +0

    Das Problem mit dieser Lösung besteht darin, dass Sie jedes verwaltete Objekt aus dem permanenten Speicher und in das Array im Speicher laden müssen. Es wird für ein paar Dutzend oder ein paar hundert Objekte funktionieren, aber darüber hinaus wird es nicht skalieren. Es wird langsam und speicherintensiv. – TechZen

    +0

    @TechZen, ja Sie sind absolut richtig, es hat Probleme mit der Herstellung von Objekten, dann hat es eine Menge Besetzung (auch die Herstellung von Objekten in Schleifen). Für dieses Problem gibt es eine andere Lösung. Änderung in der Datenbank auch nicht möglich. – Ishu

    0
    NSMutableArray* scores; 
    
    
    scores = [NSMutableArray arrayWithArray:[defaults 
    objectForKey:@"HighScores"]]; 
    [scores addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Andrew", @"Name", [NSNumber numberWithUnsignedInt:45], @"Score", nil]]; 
    [scores addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Andrew2", @"Name", [NSNumber numberWithUnsignedInt:55], @"Score", nil]]; 
    [scores sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"Score" ascending:NO] autorelease]]]; 
    
    0

    NSMutableArray als Datumsspalte sortieren, Sie haben ein beliebiges Format Datum dieser Code ist in Ordnung.

    NSSortDescriptor *sorter =[[NSSortDescriptor alloc] initWithKey:@"Date column name" ascending:sortCheck selector:@selector(compare:)]; 
            [itemsData sortUsingDescriptors:[NSArray arrayWithObject:sorter]]; 
    
    0

    Das ist meine Lösung.

    NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) { 
    
    [[DateFormatter sharedDateFormatter]setDateStyle:NSDateFormatterShortStyle]; 
    NSDate *d1 = [[DateFormatter sharedDateFormatter] dateFromString:s1]; 
    NSDate *d2 = [[DateFormatter sharedDateFormatter] dateFromString:s2]; 
    return [d1 compare:d2]; 
    

    }

    Dies nimmt das Datum, die derzeit ein String ist, wandelt es in ein Datum vergleicht es dann. Die sharedDateFormatter ist eine Singleton-Klasse für NSDateFormatter, so dass ich sie nicht jedes Mal zuordnen müsste.

    Ich würde dies nicht in einem Projekt verwenden, es hängt den Hauptthread, aber es kann für jemanden hilfreich sein. Wenn jemand einen besseren Weg wüsste, dies zu tun, würde das den Hauptthread nicht blockieren, ich weiß es zu schätzen.