2010-11-30 11 views
1

Trier le tableau en fonction de la date, Le problème est la date enregistrée au format de chaîne de caractères peut-il être possible de trier le tableau sans modifier la date dans l'objet NSDate (Données de base).trier le tableau en fonction de la date

format de chaîne est

mm/jj/aaaa

+0

quel est le format de chaîne - donner un exemple! – deanWombourne

+0

Ces données sont-elles stockées dans des objets ordinaires dans un tableau ou s'agit-il d'objets gérés dans un graphe de données de base? – TechZen

+0

il est des entités de données de base et seul moyen d'accéder à la chaîne de date en utilisant. opérateur avec l'objet de l'entité de données de base. – Ishu

Répondre

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; 

} 

Cela fonctionne pour moi.

0

Si la date est stockée dans un format où un tri alphabétique équivaut à une sorte de date, il ne peut se faire avec des données de base. Dans ce cas, vous avez deux options:

  1. Ajoutez un nouvel attribut NSDate à votre base de données et convertissez chaque date textuelle en une date réelle et mettez à jour l'enregistrement. Ensuite, vous pouvez trier avec les données de base
  2. Extraire toutes les données dans un tableau en mémoire, puis trier cela avec une méthode de comparaison personnalisée.
1

Vous pouvez créer le tri avec sortDescriptorWithKey:ascending:comparator: et fournir un bloc qui comparera deux de vos chaînes de date. Disponible dans iOS 4.0 et versions ultérieures.

+0

doit fonctionner pour toutes les versions.et comment puis-je utiliser + (id) sortDescriptorWithKey: (NSString *) clé ascendante: (BOOL) comparateur croissant: (NSComparator) cmptr – Ishu

+0

Comment puis-je mettre en œuvre celui-ci. – Ishu

1

Le chemin à parcourir est d'utiliser la méthode NSArray -sortedArrayUsingFunction:context:. Cela fonctionne dans iOS 2.0 et versions ultérieures et est assez simple. Vous appelez:

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

Et vous aurez besoin de définir la fonction comme ceci:

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 
} 

Vous aurez besoin de votre propre logique pour séparer l'année, le mois et la date de la chaîne afin que vous puissiez comparer chacun d'eux. Je ne suis pas sûr que ce soit moins de travail que de convertir les cordes en dates comme Dennis l'a suggéré, mais vous connaissez votre programme, donc celui qui fonctionne.

+0

Il peut fonctionner mais il a plus de frais généraux. Si aucune solution je vais obtenir alors j'adopte celui-ci. – Ishu

+0

Le problème avec cette solution est que vous devrez charger tous les objets gérés du magasin persistant et dans le tableau en mémoire. Cela fonctionnera pour quelques douzaines ou quelques centaines d'objets mais cela ne va pas au-delà. Il deviendra lent et nécessitera beaucoup de mémoire. – TechZen

+0

@TechZen, oui vous avez tout à fait raison d'avoir des problèmes de fabrication d'objets alors il y a beaucoup de fonte (en faisant également des objets dans les boucles). Toute autre solution existe pour ce problème.Modifier dans la base de données n'est pas possible non plus. – 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

Trier NSMutableArray en tant que colonne de date, vous avez n'importe quel format de date à laquelle ce code fonctionne correctement.

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

Ceci est ma solution.

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]; 

}

Cela prend la date, qui est actuellement une chaîne, il convertit à une date, puis compare. sharedDateFormatter est une classe singleton pour NSDateFormatter, donc je n'aurais pas besoin de l'allouer à chaque fois.

Je ne l'utiliserais pas dans un projet cependant, il bloque le fil principal, mais il peut être utile à quelqu'un. Si quelqu'un connaissait une meilleure façon de faire cela, cela ne bloquerait pas le fil principal, je l'apprécie.