2014-01-09 3 views
0

2 дня назад я задал вопрос, как отсортировать элементы по второму слову в строках объекта исортировать по NSDictionary дает другой результат, чем-то на NSArray

я получил решение here

, но теперь я застрял в новый вопрос

Рассмотрим меня

NSArray с -> имена и

NSDictionary с прежним -> имена (из NSArray) как значение и электронного идентификатор в качестве ключа

И моего NSArray содержит

"Test Teacher" 

    "Anonymous" 

    "Dok Teacher" 

и мой NSDictionary содержит

"Dok Teacher" --"[email protected]" 

    "Anonymous" -- "[email protected]" 

    "Test Teacher" --"[email protected]" 

Как мне нужно отсортировать этот массив и словарь i отсортировал их по методу, указанному в ссылке выше

, но кормовой эр сортировка Я получаю данные, как следовать

NSArray после сортировки на втором слове

"Anonymous" 

    "Test Teacher" 

    "Dok Teacher" 

NSDictionary после сортировки на втором слове значений

"Anonymous" -- "[email protected]" 

    "Dok Teacher" --"[email protected]" 

    "Test Teacher" --"[email protected]" 

почему так Dok Учителя и испытания Учитель на разных позах в словаре и в nsarray, после использования того же метода для сортировки.

И как получить их в одном порядке для массива и словаря.

код для сортировки NSArray:

NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:[teachersNames sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     return [firstTeacher2ndWord compare:secondTeacher2ndWord]; 
    }]]; 

    NSLog(@"After %@",sortedArray); 

    teachersSrc=[NSMutableArray arrayWithArray:sortedArray]; 

код для сортировки NSDictionary

myArray = [teachersList keysSortedByValueUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; 
     return [firstTeacher2ndWord compare:secondTeacher2ndWord]; 
    }]; 

    NSLog(@"After %@",myArray); 

EDIT:

я также пытался сортировать по имени как для массива и словаря, а затем сортировка по фамилии для обоих, но ее вообще не работает,

+0

Редактировать свой вопрос с помощью правильного отступа. – Tirth

+0

Где код? –

+0

Почему вы поддерживаете два набора параметров, массив и словарь? – Retro

ответ

1

Учитывая, что у вас есть это :

NSArray *array = @[@"Test Teacher",@"Anonymous",@"Dok Teacher"]; 
NSDictionary *dictionary = @{@"[email protected]":@"Dok Teacher",@"[email protected]":@"Anonymous",@"[email protected]":@"Test Teacher"}; 


//sort the array first 
    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSString *firstTeacher2ndWord =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject]; 
    NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject]; 


    if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE){ // means they are the same 
     //compare full text 
     firstTeacher2ndWord = (NSString *)obj1; 
     secondTeacher2ndWord = (NSString *)obj2; 
    } 

    return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch]; 
}]; 

NSLog(@"Sorted Array %@",sortedArray); 

//sort the dictionary key using values 
    NSArray *sortedDictionaryKey =[dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
     NSString *firstTeacher2ndWord =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject]; 
    NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject]; 


    if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE){ // means they are the same 
     //compare full text 
     firstTeacher2ndWord = (NSString *)obj1; 
     secondTeacher2ndWord = (NSString *)obj2; 
    } 


    return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] 
}]; 

//get the values from the dictionary based on the sorted keys 
NSLog(@"Sorted Dictionary %@",[dictionary objectsForKeys:sortedDictionaryKey notFoundMarker:[NSNull null]]); 

даст вам этот вывод:

//Sorted Array 
Sorted Array(
Anonymous, 
"Dok Teacher", 
"Test Teacher" 
) 

//Sorted Dictionary 
Sorted Dictionary(
    Anonymous, 
    "Dok Teacher", 
    "Test Teacher" 
) 
+0

Вы использовали второе слово (т. Е. «Учитель» в случае DOK, Test) для сортировки, если да, где вы его получите? как в моем случае objectAtIndex: 2 – ViruMax

+0

@VirendraRavalji вы имеете в виду, что вы только сортируете запись по 2-му слову? и если они те же, что и единственный раз, когда вы сравните все слово? это верно? – Joshua

+0

Я частично исправил, потому что еще не написал код, чтобы рассмотреть полное имя или полную строку – ViruMax

0

Сначала массив значений словаря (listsList) является несортированным, и вы не знаете, как упорядочен элемент.

Второй Dok Teacher и Test Teacher - это то же самое на втором слове, между ними нет порядка, порядок их после сортировки зависит от метода сортировки (стабильного или неустойчивого) и порядка исходного массива.

Если элементы массива значений имеют одинаковый порядок в teachersNames, результат будет таким же. В противном случае порядок Dok Teacher и Test Teacher не определен.

Примечание: значение массива здесь teachersList.allValues

+0

ya correct, но потом, как сделать их в том же порядке, я также попробовал сортировку по имени для массива и словаря, а затем сортировку по имени для обоих, но его вообще не работает, как это решить? – ViruMax

+0

@VirendraRavalji Если вы хотите, чтобы у них был одинаковый порядок, вы должны убедиться, что ключ, который вы использовали для сортировки, уникален. Поэтому я думаю, что вы должны сортировать по имени ни фамилию, ни имя. – KudoCC

+0

Я бы хотел, но его требование клиентом – ViruMax

0

Проблема в вашем коде второе имя Teacher содержит в двух словах. Поэтому, когда вы сортируете то же самое в массиве. Он будет сортировать имя по алфавиту. Поскольку второе имя одинаково для двух слов. Таким образом, это не отразится на выходе. Но если вы измените порядок, вы увидите ожидаемый результат. Я реализовал код для сортировки массива ниже: -

При выполнении этого кода ниже вы получите результат: -

NSArray *[email protected][@"Test Teacher",@"Anonymous",@"Dok Teacher"]; 
NSArray *sortedArray=[array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2 options:NSCaseInsensitiveSearch]; 
}]; 
NSLog(@"%@",sortedArray); 

Выход: -

Anonymous, 
"Dok Teacher", 
"Test Teacher" 
+0

по моему приоритету сортировки - это только фамилия, т.е. учитель в этом Случай, я думаю, вы рассмотрели полное имя – ViruMax

+0

@virendra, я отсортировал только имя массива, которое вы хотели в выводе. –

+0

вы прочитали мой полный вопрос, ya, я получу вывод, как это, если я сортирую имя (первое слово, т.е. Dok, Test в этом случае), но когда я отсортировал их по второму имени (т.е. учитель в этом случае), я не получая этот заказ. Посмотрите мой код три: «objectAtIndex: 2» – ViruMax

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