簡體   English   中英

優化排序和過濾對象數組

[英]Optimization of sorting and filtering array of objects

我有有效的代碼,並希望從中獲得更好的性能,因為如果傳遞更多的數據,它會被漂亮地加載。 但是我不知道該怎么辦。

輸入:帶有logUnits的數組,每個數組包含一個日志事件視圖,例如“ 2013-01-16 15:13:00 Hello”和時間數組-該數組僅包含我們有日志事件的時間(2013-01-02,2013 -01-09等)

輸出:視圖數組,其中每個視圖包含同一天的日志單位。

我還可能需要按事件類型過濾日志單元。

這是我的操作方式。

 NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];
    @autoreleasepool {

        for(int x = 0; x != times.count; x++)
        {
            UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
            foo.backgroundColor = [UIColor clearColor];
            int f = 0;
            int h = 0;

            for(int i = 0; i != objectArray.count; i++)
            {
                @autoreleasepool
                {

                    LogUnit *unit = [objectArray objectAtIndex:i];
                    if([[times objectAtIndex:x] isEqual:[unit realTime]]) 
                    {

                        if(![[foo subviews] containsObject:unit.view]) // Look if unit was already added
                        {
                            NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];
                            NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];

                            if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
                            {
                                if([unit getEvent] != NULL)
                                {
                                    unit.view.frame = CGRectMake(unit.view.frame.origin.x, f * unit.view.frame.size.height + 30, unit.view.frame.size.width, unit.view.frame.size.height);
                                    [foo addSubview:unit.view];
                                    f++;
                                    h = unit.view.frame.size.height * f;
                                }
                            }
                        }
                    }
                }
            }

            foo.frame = CGRectMake(0,0, 320, h + 30 );
            h = 0;
            [views addObject:foo];
        }

我猜這最糟糕的事情是一個循環,對於每個外部循環,我都必須重新運行所有logUnit。 但是不知道我還能怎么做。 也許有一種方法可以調用“選擇時間等於[單位實時]的單位”之類的方法嗎?

這里有一些危險信號。 懸念最少的是您正在掃描foo的所有子視圖中的unit.view,這是一個O(n)操作,這在最內層的循環中確實很麻煩。

接下來,如果您按時間對兩個數組進行排序,則實際上不必執行雙循環來查找大小相同的事件。 看看如何在合並排序中完成。

如果那還不夠好,請考慮在側線程上進行所有比較工作,並僅將add子視圖和視圖創建過程分派回主線程。 它至少會使它看起來更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM