2013-12-14 7 views
0

У меня есть два NSArrays, и оба они имеют разные ключи для своего JSON, созданного по значению. Первый массив - это список твитов Twitter, а для каждого объекта - NSDate. Другой NSArray У меня есть список фотографий Instagram и значение NSDate для объекта: created_time. Как бы поместить оба этих массива в другое NSArray и отсортировать каждое значение в зависимости от времени объекта? Как бы я поставил оба массива в NSDictionary тех же спецификаций, которые были указаны ранее?Сравнение NSDates двух разных NSArrays

ответ

2

Объединение двух массивов:

NSMutableArray *combinedArr = [[originalArray1 arrayByAddingObjectsFromArray: 
    originalArray2] mutableCopy]; 

отсортировать NSMutableArray:

  • написать метод, который возвращает NSComparisonResult описать, как объекты вы сортировки должны быть отсортированы. Если вы используете что-то вроде NSDate, вероятно, есть уже написанный метод, который сделает это за вас.
  • С этим методом написано в руке, и готов к работе, сортировать массив:
[arrToBeSorted sortUsingSelector:@selector(yourSortMethod:)]; 

Пример по наведению вместе метод сортировки:

Во-первых, вам нужно для возврата NSComparisonResult. И аргумент, который вам нужно принять, должен быть объектом того же класса, для которого вы вызываете метод (мы сравниваем Object A с Object B, оба из того же класса. И, наконец, вы ставите логику в способ определить, что NSComparisonResult вернуться.

-(NSComparisonResult)compareObjects:(MyObjectClass*)objectB { 
    // pseudo code: 
    if(self comes before objectB) { 
     return NSOrderedAscending; 
    } else if(self comes after objectB) { 
     return NSOrderedDescending; 
    } else { 
     return NSOrderedSame; 
    } 
} 

NSOrderedAscending говорит, когда я [objectA compareObjects: objectB];, что А предшествует в этой логике. Таким образом, своего рода, используя [arrToBeSorted sortUsingSelector:@selector(compareObjects:)]; возвратит массив с objectA в индексе меньше objectB.

NSOrderedDescending будет делать как раз наоборот.

NSOrderedSame говорит, что для этого сравнения, эти два объекта эквивалентны, так что это не имеет значения, является ли заказ objectA, objectB или objectB, objectA, поэтому, если сравнивать эти два объекта никогда не поменялся. Если они помещены в массив с objectC или objectD, то A и B будут отсортированы в правильном порядке относительно C и D, но A и B не будут заменены друг на друга, потому что NSOrderedSame говорит, что их порядок, относительный друг другу, не имеет значения.

И это все, что вы делаете с помощью NSComparisonResult. Вы возвращаете значение, которое сообщает вызывающему, как эти два объекта должны сортироваться относительно друг друга. Метод NSMutableArraysortUsingSelector: с использованием заданного селектора и выполняет итерацию по всем объектам, чтобы получить их все в нужном порядке, поэтому для КАЖДОГО объекта в массиве все до его возврата NSOrderedDescending или NSOrderedSame для данного selector массив был отсортирован с помощью, и все после его возвращения NSOrderedAscending или NSOrderedSame.

* В качестве примечания, для того, чтобы это работало должным образом, все в массиве должно отвечать селектору сортировки с той же логикой. Если вы напишите метод orderByDate, который сортирует по некоторому свойству object.date, это прекрасно, если каждый объект в массиве имеет метод orderByDate (и ту же логику в нем), свойство .date, и все они будут реагировать логически путь. Если вы выбрали NSString, у вас возникнут проблемы (исключение времени выполнения). Если [objectA compareObjects:objectB] возвращает NSOrderedAscending, то [objectB compareObjects: objectA]; должен вернуть NSOrderedDescending.


Для того, чтобы помещать их в словарь, вы должны быть более четкими в отношении предполагаемой структуры словаря.

+0

Не могли бы вы показать мне пример способа построения метода? – Prad

+0

@ prnk28 Если отредактировал мой ответ. – nhgrif

+0

Я отредактировал мой вопрос, чтобы добавить код – Prad

1

Существует много способов сделать то, что вы хотите. Ниже приведен подход.

  1. Создание классов для твита Instagram Изображения
  2. Написать метод адаптера вернуть созданные даты детали в

    Класс: Tweet

    - (NSDate *)createdDate { 
        return self.created_at; 
    } 
    

    Класс: InstagramPicture

    - (NSDate *)createdDate { 
        return self.created_time; 
    } 
    
  3. Объединить оба входных массивов

    NSMutableArray *combinedArray = [[NSMutableArray alloc] init]; 
    [combinedArray addObjectsFromArray:tweets]; 
    [combinedArray addObjectsFromArray:instagramPictures]; 
    
  4. Сортировать объединенный массив компаратором

    NSArray *sortedCombinedArray = [combinedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
        return [obj1.createdDate compare:obj2.createdDate]; 
    }]; 
    
+0

Я отредактировал мой вопрос, чтобы добавить код. – Prad

1

Как nhgrif сказал Объединение двух массивов по:

NSMutableArray *combinedArr = [[originalArray1 arrayByAddingObjectsFromArray: 
    originalArray2] mutableCopy]; 

И для сортировки массива

-(NSMutableArray *)sortArrayBasedOndate:(NSMutableArray *)combinedArr 
{ 
    NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init]; 
    [fmtDate setDateFormat:@"yyyy-MM-dd"]; 

    NSDateFormatter *fmtTime = [[NSDateFormatter alloc] init]; 
    [fmtTime setDateFormat:@"HH:mm"]; 

    NSComparator compareDates = ^(id string1, id string2) 
    { 
     NSDate *date1 = [fmtDate dateFromString:string1]; 
     NSDate *date2 = [fmtDate dateFromString:string2]; 

     return [date1 compare:date2]; 
    }; 

    NSComparator compareTimes = ^(id string1, id string2) 
    { 
     NSDate *time1 = [fmtTime dateFromString:string1]; 
     NSDate *time2 = [fmtTime dateFromString:string2]; 

     return [time1 compare:time2]; 
    }; 

    NSSortDescriptor * sortDesc1 = [[NSSortDescriptor alloc] initWithKey:@"start_date" ascending:YES comparator:compareDates]; 
    NSSortDescriptor * sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:@"starts" ascending:YES comparator:compareTimes]; 
    [combinedArr sortUsingDescriptors:@[sortDesc1, sortDesc2]]; 

    return combinedArr; 
} 

Попробуйте это.

+0

Я отредактировал вопрос, чтобы добавить код. – Prad

+0

Проблема в том, что вы отправляете объект сообщение, на которое он не может ответить. В этом случае похоже, что StreamViewController не может ответить на сообщение sortArrayBasedOndate :. Используйте пункты и журналы breaK и узнайте, где он сбой. –

Смежные вопросы