Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SorterDarrayusingComparator方法是如何实现的?_Ios_Objective C_Cocoa Touch_Sorting_Compare - Fatal编程技术网

Ios SorterDarrayusingComparator方法是如何实现的?

Ios SorterDarrayusingComparator方法是如何实现的?,ios,objective-c,cocoa-touch,sorting,compare,Ios,Objective C,Cocoa Touch,Sorting,Compare,我试图用Objective-C中的Comparator:方法重写官方的SorterDarray。我该怎么做 在NSArray类中,元素实际上是如何存储在数组中的? for循环中的类型是什么(在代码中:type?)?Objective-C中似乎不存在泛型。compare:方法是如何工作的 - (NSArray *)recentQuestions { return [questions sortedArrayUsingComparator: ^(id obj1, id obj2) {

我试图用Objective-C中的Comparator:方法重写官方的
SorterDarray。我该怎么做

NSArray
类中,元素实际上是如何存储在数组中的? for循环中的类型是什么(在代码中:
type?
)?Objective-C中似乎不存在泛型。
compare:
方法是如何工作的

- (NSArray *)recentQuestions {
    return [questions sortedArrayUsingComparator: ^(id obj1, id obj2) {
        Question *q1 = (Question *)obj1; 
        Question *q2 = (Question *)obj2; 
        return [q2.date compare: q1.date];
}]; }

//class NSArray

//? NSArray* selfArray = @[];
-(...) sortedArrayUsingComparator : (void (^)(id obj1, id obj2) ) blockName{
    for ( int i=0; i<selfArray.count-1; i++){ 
        for ( int j=i+1; j<selfArray.count; j++){ 
            type? *bigger = blockName(selfArray[i], selfArray[j]);          
            //move items if j>i
            if (bigger isEqual:selfArray[j]) {
                int tempValue = newArray[i];
                newArray[i] = newArray[j];
                newArray[j] = tempValue;
            }
        }
    }
}
-(NSArray*)最近的问题{
返回[使用比较器进行排序:^(id obj1,id obj2){
问题*q1=(问题*)obj1;
问题*q2=(问题*)obj2;
返回[q2.日期比较:q1.日期];
}]; }
//类NSArray
//? NSArray*selfArray=@[];
-(…)SorterDarrayusingComparator:(void(^)(id obj1,id obj2))块名{

对于(int i=0;i我将尝试回答您提出的问题


在NSArray类中,如何实际存储添加到数组中的元素?

-(...) sortedArrayUsingComparator : (void (^)(id obj1, id obj2) ) blockName{
我想你是在问如何在
NSArray
中添加新元素或修改元素顺序。这是不可能的。如果你需要改变数组的内容,你应该使用
NSMutableArray
。使用
NSMutableArray
,以下是可能的:

id tempValue = newArray[i];
newArray[i] = newArray[j];
newArray[j] = tempValue;

for循环中的类型(在代码中:
类型?
)是什么?
泛型在objective-c中似乎不存在。

您应该期望的类型是您从块中获得的任何返回类型。在您的情况下,您指定的块具有
void
返回类型,这意味着您确实不应该尝试从其结果中分配变量。下面,您将看到返回类型应列为
NSComparisonResult

-(NSArray *) sortedArrayUsingComparator : (NSComparisonResult (^)(id obj1, id obj2) ) blockName{
在我对第一个问题的回答中,您可能已经注意到objective-c中如何处理泛型指针:
id
。每个非基本对象都可以保存在
id
变量中


比较方法是如何工作的?

-(...) sortedArrayUsingComparator : (void (^)(id obj1, id obj2) ) blockName{
您应该使用Comparator为
SortedArray指定一个返回类型。我建议
NSArray
。您的块还应该有一个返回类型
NSComparisonResult

-(NSArray *) sortedArrayUsingComparator : (NSComparisonResult (^)(id obj1, id obj2) ) blockName{
现在,当您调用该块时,您将获得一个值,该值表示比较两个对象的结果。这将是
SensorDeredName
SensorDeredescing
SensorDeredescing
中的一个



我不清楚您的
selfArray
newArray
值在这里的用途。看起来您正在比较
selfArray
中的值,但随后根据该比较更改
newArray
的顺序。听起来您并不是在询问用于排序的算法,所以我就离开这里一个类一经定义就可以使用它自己,因为它可以在内部使用

NSArray可能在其实现中使用NSMutableArray,但这会很尴尬,因为NSArray是NSMutableArray的一个超类,如果超类依赖于知识子类,则被认为是糟糕的设计

但是… 事实上,我们从来没有处理过NSArray,也没有处理过NSMutableArray,它们在实例化时会创建其他子类,如u-NSArrayI(不可变)和u-NSArrayM(可变)。如果它们都知道公共NSMutableArray接口,那就绝对好了

该方法可能只是在数组上进行双循环(更有可能是一些更好的排序算法,甚至在不同的内存情况下进行多次循环),并在返回不可变副本之前填充NSMutableArray


运行时复杂度为O(n2)且内存使用率为O(1)的基本实现可能如下所示:

@interface NSArray (Comparator)
-(NSArray *)vs_sortedArrayUsingComparator:(NSComparisonResult(^)(id obj1, id obj2))comparator;
@end

@implementation NSArray (Comparator)

-(NSArray *)vs_sortedArrayUsingComparator:(NSComparisonResult(^)(id obj1, id obj2))comparator
{
    NSMutableArray *array = [self mutableCopy];
    if ([array count] > 1) {
        for (NSUInteger i = 0; i < [array count] - 1; ++i) {
            for (NSUInteger j  = i; j < [array count]; ++j) {
                if (comparator(array[i], array[j]) == NSOrderedDescending) {
                    [array exchangeObjectAtIndex:i withObjectAtIndex:j];
                }
            }
        }
    }
    return [array copy];
}
@end
导致

(
    1,
    2,
    4,
    7,
    9
)

运行时复杂度为O(n log n)的更快实现需要更多内存(平均值:O(log(n)))将是快速排序 其中,比较器块执行对象和枢轴元素之间的比较:

@interface NSArray (Comparator)
-(NSArray *)vs_sortedArrayUsingComparator:(NSComparisonResult(^)(id obj1, id obj2))comparator;
@end

@implementation NSArray (Comparator)
-(NSArray *) quicksortUsingComparator:(NSComparisonResult(^)(id obj1, id obj2))comparator
{
    NSArray *array = [self copy];

    if ([array count]<2) return [array copy];

    id pivot = [array randomElement];
    NSMutableArray *array2= [NSMutableArray array];

    array = [array arrayByPerformingBlock:^id  (id element) { return element;}
                      ifElementPassesTest:^BOOL(id element) { return comparator(element, pivot) == NSOrderedAscending;}
                         elsePerformBlock:^    (id element) { if (element!=pivot) [array2 addObject:element];}
            ];
    return [[[array quicksortUsingComparator:comparator]
                                    arrayByAddingObject:pivot]
                                        arrayByAddingObjectsFromArray:[array2 quicksortUsingComparator:comparator]];
}

-(NSArray *)vs_sortedArrayUsingComparator:(NSComparisonResult(^)(id obj1, id obj2))comparator
{
    return [self quicksortUsingComparator:comparator];
}
@end


什么是类型(在代码中:type?)i


id
,翻译为“指向任何对象的指针”。您可以将其缩写为“任何对象”,因为Objective-C中的所有对象都只能通过指针访问。

该方法已经存在,并且看起来您知道如何调用它。我不确定您在这里问什么。谢谢您的回答,我想知道该官员是如何遇到的hod是我写的。我知道mutableArray,实际上我想知道NSArray如何存储它的元素(或者说mutableArray,但我猜数组可以在它的函数中创建并返回一个mutableArray?)。因此,selfArray可能是错误的,只是如果我必须重写NSArray类,并使用数组中的元素对它们进行排序,我不知道在for循环中使用什么。感谢@vikingosegundo的回答。一个比快速排序更好的算法是迭代合并排序。在哪些方面更好?还有:谁在乎?这些是演示代码。
-(id)randomElement;