2016-08-09 7 views
0

私は2つのテーブル、ユーザー名のテーブルとスコアの1つのテーブルを持っています。これらのテーブルには2つの配列が設定されます。テーブルは、スコアに基づいて降順である必要があります。私はそれのスコアで配列を並べ替えるが、私はどのように自分のスコアに固執するユーザー名を整理することができるか分からない、彼らは別の配列にあり、スコアテーブルから別のテーブルです。私は彼らのアレイの各々内の順序の観点から、それぞれのsortedSecondArray値に固執するsortedFirstArray値が必要並べ替えられた別の配列の順序に基づいて1つの配列の順序を調整する

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

:ここに私のコードです。

UPDATEソートを行うにしようと

マイコード:

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

それぞれが 'username'と' score'(あるいはおそらくカスタムクラス)を含んでいる_single_配列の辞書を使う方が良いと思います。各ディクショナリの 'score'エントリを比較するカスタムブロックを使用してそれらをソートすることができます。また、両方のテーブルのデータソースとして同じ配列を使用できます(テーブルごとに異なるエントリを選択します)。 –

+0

クールな音がいい、あなたはコードの例を提供できますか?私は大雑把な考えを持っていると思いますので、心配はありません。 – ewizard

+1

'NSDictionary'の' -objectForKey: 'と' -setObject:forKey: 'と' NSArray'の '-sortedArrayUsingComparator : '。 –

答えて

2

代わりに二つの別々の配列を有し、かつ、直接そのうちの1枚を仕分けの手間を谷とどの項目を把握しようとするだろうがソートされたものに対応するもう一方の配列の代わりに、両方の配列のペアのエントリを1つのエンティティ(辞書またはカスタムクラスのインスタンス)にまとめて、それらを単一の配列にグループ化する必要があります。

実際のプロパティ名などは、あなたのコードによって異なりますが、一般的な考え方は、このようなものです:

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

私はちょっと試してみるつもりです。 – ewizard

+0

'self.entries = [self.entries sortedArrayUsingComparator:^ NSComparisonResult(NSDictionary * a、NSDictionary * b){ NSDate * first = [a objectForKey:" score "]; NSDate * second = [b objectForKey: "score"]; 戻り値[最初の比較:秒]。 }]; 'aとbとは何ですか?私は彼らがパラマターであるのを見ます...しかし、あなたはそのブロックでそれらを使用します。私はあなたがちょうど比較...とNSDateで起こっていることを確信していないと言ったような辞書の可変配列を作成しました。 – ewizard

+0

私のコードは10、4、3の代わりにスコアを整理しています。 – ewizard

1

クレジットは私がこれのほとんどを把握助けるためNicolasMiariに行きます。比較が行われている方法で何か不思議なことが起こっていた - それは未分類の結果を作り出していた。私はselector:@selector(localizedStandardCompare:)だったことが、最も重要なことのように思えた

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

:これは私がソート方法です。 copyの私の使用も重要かもしれません...しかし、私はそうは思わない。

関連する問題