2013-08-06 132 views
1

這是我試圖解決另一個非常具體的問題,基於字符串的順序。的iOS排序一個陣列中的另一個陣列

我拉一個列表Twitter用戶帳戶登錄到用戶設置應用程序。這將以正確的順序返回一個包含用戶名的數組。

我然後這個數組傳遞給該微博API:

https://api.twitter.com/1.1/users/lookup.json 

返回的數組包含所有的附加數據我需要登錄的每個用戶帳戶的第一陣列包含NSString的(用戶名),返回的數組已被解析爲包含具有用戶名,名稱和配置文件圖片的鍵和值的字典。

現在的問題是,順序與我通過的第一個數組完全不同。這是來自Twitter的預期行爲,但它需要按照完全相同的順序(我將引用AccountStore的原始索引將匹配第一個數組,而不是新的字典數組)。

如何判斷新數組是否與包含的字典匹配的順序與基於用戶名密鑰的第一個數組的順序相同?

我知道這聽起來令人困惑,所以讓我至少發佈數據來幫助。

這裏是第一陣列輸出:

(
    kbegeman, 
    indeedyes, 
    soiownabusiness, 
    iphonedev4me 
) 

這裏是第二陣列輸出:

(
     { 
     image = "https://si0.twimg.com/profile_images/3518542448/3d2862eee546894a6b0600713a8de862_normal.jpeg"; 
     name = "Kyle Begeman"; 
     "screen_name" = kbegeman; 
    }, 
     { 
     image = "https://si0.twimg.com/profile_images/481537542/image_normal.jpg"; 
     name = "Jane Doe"; 
     "screen_name" = iPhoneDev4Me; 
    }, 
     { 
     image = "https://twimg0-a.akamaihd.net/profile_images/378800000139973355/787498ff5a80a5f45e234b79005f56b5_normal.jpeg"; 
     name = "John Doe"; 
     "screen_name" = indeedyes; 
    }, 
     { 
     image = "https://si0.twimg.com/sticky/default_profile_images/default_profile_5_normal.png"; 
     name = "Brad Pitt"; 
     "screen_name" = soiownabusiness; 
    } 
) 

由於到Twitter返回數據的方式,它是從不完全相同的順序,所以我每次調用這些方法時都要檢查一下。

任何幫助將是偉大的,將拯救我的夜晚。提前致謝!

+1

哎呀,我不敢相信以前沒有人問過這個問題。 –

回答

6

您希望通過比較screen_name值與第一個數組來排序字典數組。對?此外,屏幕名稱可能與您的用戶名不同。對?

我會用映射詞典:

  1. 創建字典從網名用戶詞典

    NSArray *screenNames = [arrayOfUserDicts valueForKeyPath:@"screen_name.lowercaseString"]; 
    NSDictionary *userDictsByScreenName = [NSDictionary dictionaryWithObjects:arrayOfUserDicts forKeys:screenNames]; 
    
  2. 通過查找用戶字典數組中的用戶名構建最終陣列:

    NSMutableArray *sortedUserDicts = [NSMutableArray arrayWithCapacity:arrayOfUsernames.count]; 
    for (NSString *username in arrayOfUsernames) { 
        NSDictionary *userDict = [userDictsByScreenName objectForKey:username.lowercaseString]; 
        [sortedUserDicts addObject:userDict]; 
    } 
    
+0

這不正是我所建議的嗎? –

+1

是的,我很抱歉,但我正在輸入我的答案。 – Tricertops

+0

@MartinR有人低估了我們倆... – Tricertops

0

該排序順序不是容易複製的東西(即它不是alpha等)。相反,你應該只使用原裝NSArray爲指導,以匹配來自NSDictionary來自Twitter的數據。例如:

[twitterDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    NSInteger index = [yourLocalArray indexOfObject:obj]; 
    if (index != NSNotFound) { 
    // You have a match, do something. 
    } 
}]; 
2

首先產生的「SCREEN_NAME」爲相應的字典 映射所述第二陣列中的映射:

NSDictionary *map = [NSDictionary dictionaryWithObjects:secondArray 
          forKeys:[secondArray valueForKey:@"screen_name"]]; 

然後就可以用一個單迴路創建排序後的數組:

NSMutableArray *sorted = [NSMutableArray array]; 
for (NSString *name in firstArray) { 
    [sorted addObject:map[name]]; 
} 
+0

@Downvoter:有何評論? –

0

允許將數組命名爲firstArray和secondArray。

NSArray *sortedArray = [secondArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
     return [@([firstArray indexOfObject:[obj1 objectForKey:@"name"]]) compare:@([firstArray indexOfObject:[obj2 objectForKey:@"name"]])]; 
    }]; 
+0

請注意,這需要對每個比較進行兩次'indexOfObject:'查找,因此對於較大的數組可能會嚴重縮放。 –