2014-12-06 33 views
0

是否有任何方法可以在NSMutableArray中隨機播放特殊套件?在NSMutableArray中隨機播放特殊套件

例如,這是我的NSMutableArray:

self.resultsdict : (
     { 
     Id = 261496; 
     packID = 1057; 
     title = "cat" 
}, 
     { 
     Id = 261497; 
     packID = 1057; 
     title = "dog" 
}, 
     { 
     Id = 261498; 
     packID = 1057; 
     title = "fish" 
}, 
     { 
     Id = 261499; 
     packID = 1059; 
     title = "donkey" 
}, 
     { 
     Id = 261500; 
     packID = 1060; 
     title = "cow" 
}, 

現在我想在清單上洗牌與 「packID = 1057」 項目。還有其他項目應該用

正常順序。

輸出標題應該是:貓,狗,魚] < - 以隨機順序,其餘[驢,牛]

正常的順序

我可以洗這個代碼的所有列表,但有什麼辦法來修改它以上提出?

for (int x = 0; x < [self.resultsdict count]; x++) { 
     int randInt = (arc4random() % ([self.resultsdict count] - x)) + x; 
     [self.resultsdict exchangeObjectAtIndex:x withObjectAtIndex:randInt]; 
    } 

一個解決方案,我發現是做兩個NSMutableArray裏,一個洗牌,另一個用於

正常秩序和洗牌後,我將它們與addObjectsFromArray合併。

但是這種解決方案是有點難以用於多個混洗表,如下所示:

self.resultsdict : (
     { 
     Id = 261496; 
     packID = 1057; 
     title = "cat" 
}, 
     { 
     Id = 261497; 
     packID = 1057; 
     title = "dog" 
}, 
     { 
     Id = 261498; 
     packID = 1057; 
     title = "fish" 
}, 
     { 
     Id = 261499; 
     packID = 1059; 
     title = "donkey" 
}, 
     { 
     Id = 261500; 
     packID = 1060; 
     title = "cow" 
}, 
     { 
     Id = 261501; 
     packID = 1060; 
     title = "AyeAye" 
}, 

用以下條件=> 「packID = 1057」 和 「packID = 1060」

和下面的輸出:

[貓,狗,魚] < - 隨機順序+ [驢] + [牛,aye aye] < - 隨機順序。

更多信息:

程序,使查詢與輸精管PackID測試。

SELECT * FROM tests WHERE packID IN ("1057","1059","1060") 

查詢的結果將被插入到 「self.resultsdict

FMResultSet *results_packs = [db executeQuery:sql]; 
    while([results_packs next]) 
    { 

     [self.resultsdict addObject:[results_packs resultDictionary]]; 
    } 

用戶具有用於測試查詢的混洗能力。例如他/她可以選擇顯示「1057」,「1060」和「1059」的訂購版本的洗牌版本

現在我想要做的就是修改我的正常洗牌代碼接受的條件數組,每一樣下列鍵洗牌

項目(「1057」,「1060」)。

感謝在前進

+0

這是一個算法和任務的主體,很難與iOS或Obj-C相關。你的任務不是具體的,ID = 1057的對象是什麼,它們位於列表的末尾,還是隨機傳播,結果是什麼?它們是否應該混合在「1057」之中,還是應該對每組這樣的物品進行洗牌? – Gobra 2014-12-06 08:24:32

+0

你的權利,我會盡快更新我的問題。 – 2014-12-06 08:26:08

回答

1

好了,你可以掃描陣列檢查ID範圍內的物品(這也可以通過NSPredicate實現),並建立了一套指標擁有的所有的位置你感興趣的數組元素。

現在,有小號準備,你可以使用你有相同的交換伎倆你的樣品中,但不是純隨機 - 使用是有限的,在索引小號即交換對象與索引的一些其他對象S

僞代碼將是類似的東西:

foreach (index in S) 
{ 
    otherIndex = S.randomIndex() 
    array.swapObjects(index, otherIndex) 
} 

如果我收到了你的任務得當,該代碼將做的工作:它會隨機洗牌某些特定種類的物體,留下其餘全部爲是。

UPD: 爲了打造小號組必須抓住此刻用戶改變他的選擇和運行自己的方法,將兩種:

  • 掃描array手動檢查記錄ID值和 上array構建NSMutableSet
  • 運行NSPredicate,掃描的ID,你需要

謂詞似乎在這裏更類似於SQL的方式,想約這樣的:

NSPredicate* scanRecordWithIDsPredicate = [NSPredicate predicateWithFormat:@"packID IN %@", userSpecifiedSetOfIDs]; 
NSSet* setOfIndicies = [array filteredArrayUsingPredicate: scanRecordWithIDsPredicate]; 

UPD2: 既然你已經有一個SQL-backhroud,我想你可以使用類似的東西以及:MySQL: Shuffle a limited query result?,在查詢中對輸出權進行混洗。

+0

感謝您的回答,這正是我想要做的。 但是有一件事,我可以製作一套S指數?因爲數組條件是動態的。 – 2014-12-06 12:35:38

+1

我已經更新了答案,查看了一下。 – Gobra 2014-12-06 13:44:54