ios - 删除数组元素并将它们添加到同一索引 iOS

标签 ios objective-c arrays nsmutablearray nsmutabledictionary

我正在对一个数组进行排序。 数组中有三种类型的元素。 1.精选 2.有机和 3. 声称。

其中,我只想对有机元素进行排序,并将特色元素和声明元素保留在它们自己的索引中。

下面是我的代码,其中我在字典中提取声明和特征索引,因为键是索引,值是数组元素。

//Initialization
NSMutableArray *sortedArray = nil;
NSMutableDictionary *tempFeaturedDictionary = [[NSMutableDictionary alloc]init];
NSMutableDictionary *tempClaimedDictionary = [[NSMutableDictionary alloc]init];
NSMutableArray *tempOrganicArray = [[NSMutableArray alloc]init];

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

    DRListing *isFeaturedObj = (DRListing*)[array objectAtIndex:i];

    if (isFeaturedObj.featured) {
        [tempFeaturedDictionary setObject:isFeaturedObj forKey:[@(i)stringValue]];
    }else if (isFeaturedObj.claimed)
    {
        [tempClaimedDictionary setObject:isFeaturedObj forKey:[@(i)stringValue]];
    }else
        [tempOrganicArray addObject:isFeaturedObj];

}

在排序后,我再次将声明和特色添加回它们的原始索引:

 sortedArray = [NSMutableArray arrayWithArray:[tempOrganicArray sortedArrayUsingDescriptors:sortDescriptorsArray]];

for (int i = 0; i<sortedArray.count; i++) {
    for (NSString *key in tempFeaturedDictionary) {
        if ( [[@(i)stringValue] isEqualToString: key] ) {
            [sortedArray insertObject:[tempFeaturedDictionary objectForKey:[@(i)stringValue]] atIndex:i];
        }}

    for (NSString *key in tempClaimedDictionary) {
        if ([[@(i)stringValue]isEqualToString:key ]) {
            [sortedArray insertObject:[tempClaimedDictionary objectForKey:[@(i)stringValue]] atIndex:i];
        }
    }
}

代码运行良好。除了在“数组”的最后一个索引处有声明/(和)特色元素。因为在这种情况下,“sortedArray”索引仍然小于“array.count”。 提前致谢。

更新-

我收到类型的响应数组:

[{featured1 featured2}, {organic1, organic2..}, {claimed1}, {featured11, featured12}, {organic11, organic12..}, {claimed2}, ..]

而且我只能对该数组中的有机元素进行排序。精选和声明不应失去其原始索引位置。

最佳答案

我会遍历数组,提取有机物进行排序。然后对您的有机阵列进行排序。然后迭代原始数组,适本地获取原始数组中的元素或排序后的有机物数组中的元素。

NSMutableArray *organicsArray = [NSMutableArray new];

for (int i = 0; i < array.count; i++) {
    DRListing *isFeaturedObj = (DRListing*)array[i];

    if ((!isFeaturedObj.featured) && (!isFeaturedObj.claimed)) {
        [organicsArray addObject:isFeaturedObj];
    }
} 
NSMutableArray *sortedOrganicsArray = [[organicsArray sortedArrayUsingDescriptors:sortDescriptorsArray] mutableCopy];

NSMutableArray *outputArray = [NSMutableArray new];

for (int i = 0; i < array.count; i++) {
    DRListing *isFeaturedObj = (DRListing*)array[i];

    if ((!isFeaturedObj.featured) && (!isFeaturedObj.claimed)) {
        [outputArray addObject:sortedOrganicsArray[0]];
        [sortedOrganicsArray removeObjectAtIndex:0];
    } else {
        [outputArray addObject:isFeaturedObject];
    }
}

如果你颠倒有机物数组的排序顺序,你可能会提高它的效率,因为那时你可以说

[outputArray addObject:[sortedOrganicsArray lastObject]];
[sortedOrganicsArray removeLastObject];

但是如果您的数组不是特别大,那么性能改进可能可以忽略不计。

关于ios - 删除数组元素并将它们添加到同一索引 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37207407/

相关文章:

ios - Xcode 6 Beta 6 上的 iPhone 5c 配置

ios - 在 iOS 中更改 UITableView 的标题时遇到问题

ios - UIAlertController 给出错误

ios - 第一个字母在 UITextField 中用斜体字体截断

ios - 如何在 Swift 框架中导入私有(private)框架头文件?

iphone - block 而不是 performSelector :withObject:afterDelay:

IOS - 根据对象值分组对象并显示在 UItableview 部分

c - 如何修改传递给函数的二维数组?

Java:返回添加到数组中的数字

java - 在二维数组的边界周围制作一个星形的正方形