2016-08-09 53 views
0

Ich habe zwei Tabellen, eine Tabelle für Benutzernamen und eine Tabelle für Punkte. Ich befülle diese Tabellen mit zwei Arrays. Die Tabellen müssen basierend auf den Scores in absteigender Reihenfolge angeordnet sein. Ich sortiere das Array mit den Noten darin, aber ich bin mir nicht sicher, wie ich die Benutzernamen so einrichten kann, dass sie bei ihrer Punktzahl bleiben, sie sind in einem separaten Array und einer separaten Tabelle aus der Scores-Tabelle. Hier ist mein Code:Reihenfolge von einem Array basierend auf der Reihenfolge eines anderen Arrays anpassen, das sortiert wurde

dictionary = [NSDictionary dictionaryWithObjects:matchesForUser forKeys:tableData]; 
sortedFirstArray = [dictionary allKeys]; 
sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]]; 
sortedSecondArray = [sortedSecondArray sortedArrayUsingSelector: @selector(compare:)]; 

Ich brauche die sortedFirstArray Werte mit ihren jeweiligen sortedSecondArray Werte in ihrer Reihenfolge in jeder ihrer Reihen zu halten.

UPDATE

Mein Code versucht, die Sortierung zu tun:

PFQuery *query = [PFQuery queryWithClassName:@"_User"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (!error) { 
       entries = [NSMutableArray new]; 
       for (PFObject *object in objects) { 
        NSLog(@"%@", object.objectId); 
        [tableData addObject:[object valueForKey:@"username"]]; 
        [matchesForUser addObject:[object valueForKey:@"matches"]]; 

        NSMutableDictionary* entry = [NSMutableDictionary new]; 

        entry[@"username"] = [object valueForKey:@"username"]; 
        entry[@"matches"] = [object valueForKey:@"matches"]; 

        [entries addObject:entry]; 

        //transfer = entries; 
       } 
       transfer = [entries sortedArrayUsingComparator:^NSComparisonResult(NSDictionary* a, NSDictionary* b) { 
        NSDate *first = [a objectForKey:@"matches"]; 
        NSDate *second = [b objectForKey:@"matches"]; 
        NSLog(first); 
        NSLog(second); 
        return [first compare:second]; 
       }]; 
      //dictionary = [NSDictionary dictionaryWithObjects:matchesForUser forKeys:tableData]; 
      //sortedFirstArray = [dictionary allKeys]; 
      //sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]]; 
      //sortedSecondArray = [sortedSecondArray sortedArrayUsingSelector: @selector(compare:)]; 
      [_tableView reloadData]; 
      [_tableViewScore reloadData]; 

     }else{ 
      NSLog([error description]); 
     } 

     NSLog(@"***tabledata***"); 
     NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[tableData count]]); 
     NSLog(@"***matchesdata***"); 
     NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[matchesForUser count]]); 
    }); 
}]; 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
if(tableView.tag == 1) { 
    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]; 
    cell.textLabel.textColor = [UIColor colorWithRed:218.0f/255.0f green:247.0f/255.0f blue:220.0f/255.0f alpha:1.0f]; 
    cell.backgroundColor = [UIColor colorWithRed:153.0f/255.0f green:211.0f/255.0f blue:212.0f/255.0f alpha:1.0f]; 
    cell.layoutMargins = UIEdgeInsetsZero; 
    cell.preservesSuperviewLayoutMargins = NO; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

    UILabel *contentV = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 230, 44)]; 
    contentV.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]; 
    contentV.textColor = [UIColor colorWithRed:218.0f/255.0f green:247.0f/255.0f blue:220.0f/255.0f alpha:1.0f]; 
    contentV.backgroundColor = [UIColor colorWithRed:153.0f/255.0f green:211.0f/255.0f blue:212.0f/255.0f alpha:1.0f]; 

    cell.contentView.layoutMargins = UIEdgeInsetsZero; 

    NSString *username2 = [[transfer objectAtIndex:indexPath.row] valueForKey:@"username"]; 

    NSLog(@"***username***"); 
    NSLog(username2); 

    contentV.text = username2; 
    [cell.contentView addSubview:contentV]; 

    return cell; 
} 
else { 
    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]; 
    cell.textLabel.textColor = [UIColor colorWithRed:153.0f/255.0f green:211.0f/255.0f blue:212.0f/255.0f alpha:1.0f]; 
    cell.backgroundColor = [UIColor colorWithRed:218.0f/255.0f green:247.0f/255.0f blue:220.0f/255.0f alpha:1.0f]; 
    cell.textLabel.textAlignment = NSTextAlignmentCenter; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

    NSString *matchAmount = [[transfer objectAtIndex:indexPath.row] valueForKey:@"matches"]; 
    NSLog(@"***matchamount***"); 
    NSLog(matchAmount); 

    cell.textLabel.text = matchAmount; 

    return cell; 

} 
} 
+3

Ich denke, Sie sind besser dran mit einem _single_ Array von Wörterbüchern, jedes mit einem 'username' und einem' score' (oder vielleicht eine benutzerdefinierte Klasse). Sie können sie mit einem benutzerdefinierten Block sortieren, der den "score" -Eintrag jedes Wörterbuchs vergleicht, und Sie können dasselbe Array als Datenquelle für beide Tabellen verwenden (indem Sie für jede Tabelle einen anderen Eintrag auswählen). –

+0

cool klingt gut, können Sie ein Codebeispiel bereitstellen? Ich denke, ich habe eine ungefähre Idee, also keine Sorgen, wenn nicht – ewizard

+1

Es ist ziemlich einfach, wenn Sie 'NSDictionary's' -objectForKey: 'und' -setObject: forKey: 'und' NSArray''s '-sortedArrayUsingComparator verwenden können : '. –

Antwort

2

Statt zwei getrennte Anordnungen von mit und gehen Trog die Mühe einer von ihnen direkt Sortieren und versuchen, herauszufinden, welche Einträge Die anderen entsprechen denen im sortierten, Sie sollten stattdessen die gepaarten Einträge beider Arrays in einer Entität (Wörterbuch oder Instanz einer benutzerdefinierten Klasse) zusammenfassen und diese in Ihrem (einzelnen) Array gruppieren:

Die tatsächlichen Eigenschaftsnamen etc. für Ihren Code unterschiedlich sein, aber die allgemeine Idee ist wie folgt:

self.entries = [NSMutableArray new]; 

for (int i=0; i < userNameArray.count; i++){ 

    NSMutableDictionary* entry = [NSMutableDictionary new]; 

    entry["userName"] = [userNameArray objectAtIndex: i]; 
    entry["score" ] = [scoreArray objectAtIndex: i]; 
    //^TODO: Make sure scoreArray has at least as many elements 
    // as userNameArray! 

    [self.entries addObject: entry]; 
} 

self.entries = [self.entries sortedArrayUsingComparator:^NSComparisonResult(NSDictionary* a, NSDictionary* b) { 
    NSDate *first = [a objectForKey:"score"]; 
    NSDate *second = [b objectForKey:"score"]; 
    return [first compare:second]; 
}]; 

// (...) 

UITableViewCell* tableView:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath}) indexPath 
{ 
    NSDictionary* entry = [self.entries objectAtIndex: indexPath.row]; 

    if (tableView == self.userNameTableView) { 
     // (dequeue user cell...) 

     cell.titleLabel.text = [entry objectForKey: "userName"]; 
     return cell 
    } 
    else{ 
     // (dequeue score cell...) 

     cell.titleLabel.text = [entry objectForKey: "score"]; 
     return cell 
    } 
} 
+0

genial danke ... ich werde es in ein paar Minuten versuchen – ewizard

+0

für 'self.entries = [self.entries sortedArrayUsingComparator:^NSComparisonResult (NSDictionary * a, NSDictionary * b) { NSDate * erste = [ein objectForKey:" "]; NSDate * Sekunde = [b objectForKey: "score"]; zurück [zuerst vergleichen: Sekunde]; }]; 'Was sind a und b? Ich sehe sie sind Parameter ... aber dann benutzt du sie in diesem Block. Ich habe ein veränderliches Array von Wörterbüchern erstellt, wie du gesagt hast, einfach nicht sicher, was mit dem Vergleich ... und dem NSDate auch passiert. – ewizard

+0

mein code organisiert die scores (ich nenne sie Übereinstimmungen in meinem code) 10, 3, 4 statt 10, 4, 3 ... im post was ich getan habe – ewizard

1

Credit NicolasMiari geht für mich die meisten dieser herausfinden zu helfen. Etwas Seltsames passierte mit der Art, wie der Vergleich gemacht wurde - und es ergab ein unsortiertes Ergebnis. Dies ist, wie ich nach:

NSSortDescriptor * descriptor = [[NSSortDescriptor alloc] initWithKey:@"matches" ascending:NO selector:@selector(localizedStandardCompare:)]; 
NSArray *entrieshold = [entries sortedArrayUsingDescriptors:@[descriptor]]; 
transfer = [entrieshold copy]; 

Es ist wie das Wichtigste schien für mich selector:@selector(localizedStandardCompare:) war. Meine Verwendung von copy kann auch wichtig sein ... aber ich denke nicht.