SlideShare ist ein Scribd-Unternehmen logo
1 von 21
Downloaden Sie, um offline zu lesen
Алгоритмы и коллекции 
стандартных библиотек 
C++, C#, Java, Objective-C 
Антон Буков 
@k06a 
Об одной жемчужине Microsoft, 
портированной на Obj-C...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Objective-C, Антон Буков
Основные сущности 
стандартной библиотеки 
• Коллекции (структуры данных) 
• Алгоритмы (универсальные и специальные) 
• Перечислители (iterator, enumerator)
Коллекции. 
(структуры данных) 
C++ 
(STL) 
C# 
(.NET Framework) 
Java 
(Collections Framework) 
Obj-C 
(Foundation Framework) 
Постоянного 
размера 
[] 
std::array 
Array Array 
[] 
NSArray 
Не зависят 
от значений 
vector list stack 
queue deque 
List LinkedList 
Stack Queue 
ArrayList 
LinkedList 
ArrayDeque 
NSMutableArray 
NSPointerArray 
Сравнивают 
значения 
set 
map 
SortedSet 
SortedDictionary 
TreeSet 
TreeMap 
NSMutable- 
OrderedSet 
Считают хеши 
и сравнивают 
значения 
unordered_set 
unordered_map 
Set 
Dictionary 
HashSet/ 
LinkedHashSet 
HashMap/ 
LinkedHashMap 
NSMutableSet 
NSCountedSet 
NSHashTable 
NSMutableDictionary 
NSMapTable
Иерархия коллекций. 
Интерфейсы C# и Java 
IEnumerable 
• GetEnumerator 
ICollection 
• Count 
• Add 
• Clear 
• Contains 
•Remove 
ISet 
• bool Add 
•∩∪⊂⊃ 
IList 
• Item[i] 
• Insert 
• IndexOf 
• RemoveAt 
IDictionary 
• Item[key] 
• Add(key,value) 
• ContainsKey 
• Remove(key) 
Collection 
• iterator 
• size 
• add 
• clear 
• contains 
• remove 
SortedSet 
• subSet 
• headSet 
• tailSet 
• first 
• last 
List 
• add(i,o) 
• get 
• set 
• indexOf 
• remove(i) 
• subList 
• listIterator 
Queue 
• add 
• element 
• remove() 
• offer 
• peek 
• poll 
Set Deque 
• addF/L 
• removeF/L 
• getF/L 
• offerF/L 
• peekF/L 
• pollF/L 
Map 
• size 
• put 
• clear 
• containsK/V 
• remove 
• entrySet 
• keySet 
• values 
SortedMap 
• subMap 
• headMap 
• tailMap 
• firstKey
Иерархия коллекций. 
C++ и Obj-C 
Input 
iterator 
Output 
iterator 
Forward 
iterator 
Bidirectional 
iterator 
Random 
Access 
iterator 
NSArray 
NSMutableArray 
NSPointerArray NSCountedSet 
NSDictionary 
NSMutableDictionary 
NSSet 
NSMutableSet 
NSOrderedSet 
NSIndexSet 
NSHashTable 
NSMutableIndexSet 
NSMapTable 
NSMutableOrderedSet
Иерархия коллекций. 
Итераторы в C++ (STL) 
Категории Характеристика Выражение 
все 
Может быть скопирован и создан по образу и подобию X b(a); и b = a; 
Может быть увеличен на единицу ++a и a++ 
RA 
BD 
FW 
I 
Поддерживает сравнение на равенство/неравенство a == b и a != b 
Может быть разыменован как rvalue для получения значения *a 
a->m 
O 
Может быть разыменован как lvalue для использования слева от 
знака присваивания 
*a = t 
*a++ = t 
Может быть создан конструктором по-умолчанию X a; 
Может быть скопирован и использован для повторного обхода 
X b(a); 
++a == ++b 
Может быть уменьшен на единицу --a и a-- 
Поддерживает арифметические операции + и - a+n и a—n 
Поддерживает сравнения (<, >, <= и >=) между итераторами a < b и a <= b 
Поддерживает операции увеличения += и уменьшения -= a += n и a -= n 
Поддерживает разыменование по индексу a[n] 
RA — Random Access iterator 
BD 
— Bidirectional iterator 
I 
— Input iterator 
O 
— Output iterator 
FW — Forward iterator
Перечислители 
(iterator, enumerator) 
C++ C# 
for (auto it = arr.begin(); 
it != arr.end(); ++it) 
{ 
std::cout << *it; 
sum += *it; 
} 
// --it, it+n, it-n 
var en = arr.GetEnumerator(); 
while (en.MoveNext()) 
{ 
Console.Write(en.Current); 
sum += en.Current; 
} 
en.Dispose(); // using 
Java Objective-C 
Iterator it = arr.iterator(); 
while (it.hasNext()) 
{ 
int value = (Integer) it.next(); 
System.out.print(value); 
sum += value; 
} 
id en = [arr objectEnumerator]; 
id object; 
while (object = [en nextObject]) 
{ 
NSLog(@"%@", object); 
sum += [object intValue]; 
}
Алгоритмы 
(1 из 2) 
C++ 
(STL) 
C# 
(.NET Framework) 
Java 
(Collections Framework) 
Obj-C 
(Foundation Framework) 
Работа с 
множествами 
merge set_union 
set_intersect 
set_difference 
Union Intersect 
Except 
disjoint 
unionSet minusSet 
intersectSet 
removeObjects- 
InArray 
Сортировки 
sort stable_sort 
partial_sort 
OrderBy ThenBy 
OrderByDescending 
ThenByDescending 
sort sorted 
sortedArray* 
keysSortedBy* 
Поисковые 
find search 
binary_search 
List.BinarySearch 
List.Find*** 
IList.IndexOf 
Where TakeWhile 
SkipWhile 
binarySearch 
indexOfSubList 
filter 
indexOfObject* 
filterUsing filtered*Using 
objectsPassingTest 
NSPredicate 
NSExpression 
Аггреагирующие 
all_of any_of 
none_of count 
min max 
All Any Count 
Sum Average 
Min Max 
frequency 
min max allMatch 
anyMatch reduce 
noneMatch 
valueForKeyPath 
@avg @count 
@max @min 
@sum
Алгоритмы 
(2 из 2) 
C++ 
(STL) 
C# 
(.NET Framework) 
Java 
(Collections Framework) 
Obj-C 
(Foundation Framework) 
Прочие 
copy 
swap 
transform 
replace 
fill 
generate 
remove 
unique 
reverse 
rotate 
shuffle 
List.Reverse 
Select 
Take 
Skip 
Enumerable.Repeat 
Enumerable.Range 
Distinct 
Reverse 
Join 
GroupBy 
SelectMany 
copy 
swap 
replaceAll 
fill 
reverse 
rotate 
shuffle 
@distinctUnion- 
OfObjects 
@unionOfObjects 
@distinctUnion- 
OfArrays 
@unionOfArrays 
@unionOfSets
Пример 
(1 из 6) 
• Дано: 
struct Tweet { id, time, text, url, user_id }; 
struct User { id, name, nick }; 
array<Tweet> tweets; 
map<int,User> userDict; 
• Найти: 
Имя пользователя с максимальным числом твитов за 
фиксированную дату (1 сент 2013), содержащих ссылку в поле 
url и само количество таких твитов.
Пример 
(2 из 6) 
С++: 
map<int,int> countByUserId; 
for (auto it = tweets.begin(); it != tweets.end(); ++it) 
if ("2013-09-01" <= it->time && it->time < "2013-09-02") 
if (it->url != 0) 
countByUserId[it->user_id]++; 
auto para = max_element(countByUserId.begin(), 
countByUserId.end(), 
[](pair<int,int> a, pair<int,int> b) 
{ return a.second < b.second; }); 
cout << "User = " << userDict[para.first].name << endl 
<< "Value = " << para.second << endl;
Пример 
(3 из 6) 
Obj-C: 
NSMutableDictionary * countByUserId = [NSMutableDictionary dictionary]; 
for (Tweet * tweet in tweets) 
if ([@"2013-09-01" compareTo:tweet.time] <= 0 && [tweet.time compareTo:@"2013-09-02"] < 0) 
if (tweet.url != 0) { 
int count = [countByUserId[tweet->user_id] intValue]; 
countByUserId[tweet->user_id] = @(count + 1); 
} 
int maxCount = 0; 
id maxKey = nil; 
[countByUserId enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
if ([obj intValue] > maxCount) { 
maxCount = [obj intValue]; 
maxKey = key; 
} 
}]; 
NSLog(@"User = %@nValue = %d", 
[userDict[maxKey] name], 
maxCount);
Пример 
(4 из 6) 
Java: 
HashMap<int,int> countByUserId = new HashMap<int,int>(); 
for (Tweet tweet : tweets) 
if ("2013-09-01" <= tweet.time && tweet.time < "2013-09-02") 
if (tweet.url != 0) { 
int count = countByUserId.get(tweet.user_id); 
countByUserId.set(tweet->user_id, (count==null?0:count) + 1); 
} 
int maxCount = 0; 
id maxKey = nil; 
for(Entry<int,int> entry : countByUserId.entrySet()) { 
if (entry.getValue() > maxCount) { 
maxCount = entry.getValue(); 
maxKey = entry.getKey(); 
} 
} 
System.out.format("User = %snValue = %d", 
userDict.get(maxKey), 
maxCount);
Пример 
(5 из 6) 
C#: 
var group = tweets.Where(t => "2013-09-01" <= t.time 
&& t.time < "2013-09-02") 
.Where(t => t.url != null) 
.GroupBy(t => t.user_id) 
.Max(gr => gr.Count()); 
Console.WriteLine("User = {0}nValue = {1}", 
userDict[group.Key].name, 
group.Count());
Пример 
(6 из 6) 
Java 8 (java.util.stream): 
Entry<int,List<int>> 
entry = tweets.stream() 
.filter(t -> "2013-09-01" <= t.time 
&& t.time < "2013-09-02") 
.filter(t -> t.url != null) 
.groupingBy(t -> t.user_id) // Map<int,List<int>> 
.entrySet().stream() 
.max((a,b) -> Int.compare(a.getValue().size(), 
b.getValue().size())); 
System.out.format("User = %snValue = %d", 
userDict.get(entry.getKey()), 
entry.getValue().size());
Пример 
(7 из 6, ага) 
Obj-C + NSEnumeratorLinq: 
var para = [[[[tweets.objectEnumerator 
where:^(Tweet *t){return [@"2013-09-01" compareTo:t.time] <= 0 
&& [t.time compareTo:@"2013-09-02"] < 0;}] 
where:^(Tweet *t){return t.url != null;}] 
groupBy:^(Tweet *t){return t.user_id;}] 
max:^(NSKeyValuePair *p){return @([p.value count]);}]; 
NSLog(@"User = %@nValue = %@", 
[userDict[para.key] name], 
[para.value count]);
Сравнение архитектур 
стандартных библиотек 
С++: 
• Иерархия итераторов 
• Алгоритмы универсальные, зависят от категорий итераторов 
С#: 
• Иерархия интерфейсов 
• Алгоритмы универсальные, зависят от интерфейсов, выстраиваются в цепь 
Java: 
• Иерархия интерфейсов 
• Алгоритмы универсальные, зависят от интерфейсов (java.util.Collections) 
• Алгритмы универсальные, выстраиваются в цепь (java.util.stream) 
Obj-C: 
• Иерархия отсутствует, если не считать Immutable-Mutable 
• Алгоритмы специфичные кроме одного :) [NSEnumerator allObjects]
NSEnumeratorLinq 
• Основные методы: 
• where, where_i, ofType 
• select, select_i 
• distinct 
• skip, skipWhile 
• take, takeWhile 
• groupBy, selectMany 
• orderBy, orderByDescending 
• Аккумуляция: 
• aggregate, elect, elementAt 
• all, any, none 
• min, max 
• sum, average 
• firstOrDefault, lastOrDefault 
• Работа с множествами: 
• concat, concatOne 
• union, intersect, except 
• zip 
• join, groupJoin 
• Экспорт: 
• toArray, toSet 
• toDictionary, toLookup 
• Дополнительно: 
• readBytes, readLines 
• keyValueEnumerator 
• stringByJoin-withSeparator 
• enumerateCharacters
Полезные ссылки 
• Collections Programming Guide - https://developer.apple.com/ 
library/mac/documentation/cocoa/conceptual/Collections/ 
Collections.html 
• NSSortDescriptor - http://nshipster.com/nssortdescriptor/ 
• NSPredicate - http://nshipster.com/nspredicate/ 
• NSExpression - http://nshipster.com/nsexpression/ 
• NSOrderedSet - http://nshipster.com/nsorderedset/ 
• Key-Value Collection Operators — https://developer.apple.com/ 
library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/ 
Articles/CollectionOperators.html 
• https://github.com/robrix/RxCollections 
• https://github.com/k06a/NSEnumeratorLinq
One more thing… 
• Оператор if-null 
• Код на C#: 
string priceStr = priceHolder.get(featureName); 
PriceLabel.Text = priceStr ?? "$0.99"; 
• Код на Obj-C: 
NSDictionary *prices = [self.storeManager pricesDictionary]; 
NSString *p1 = prices[@"com.identifier1"] ?: @"$0.99";

Weitere ähnliche Inhalte

Was ist angesagt?

Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Platonov Sergey
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsГлеб Тарасов
 
Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подходаIgor Kashkuta
 
Метапрограммирование за гранью приличия
Метапрограммирование за гранью приличияМетапрограммирование за гранью приличия
Метапрограммирование за гранью приличияAlexander Schepanovski
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptDenis Latushkin
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Pythondudarev
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream APICEE-SEC(R)
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 

Was ist angesagt? (19)

Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
 
Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подхода
 
Метапрограммирование за гранью приличия
Метапрограммирование за гранью приличияМетапрограммирование за гранью приличия
Метапрограммирование за гранью приличия
 
Основы языка R
Основы языка RОсновы языка R
Основы языка R
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Javascript
JavascriptJavascript
Javascript
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в Javascript
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Python
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 

Andere mochten auch

Light ViewControllers
Light ViewControllersLight ViewControllers
Light ViewControllersachernish85
 
Java. Lecture 01. Introducing Java
Java. Lecture 01. Introducing JavaJava. Lecture 01. Introducing Java
Java. Lecture 01. Introducing Javacolriot
 
Open Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeряOpen Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeряAndrew Zaikin
 
20 most important java programming interview questions
20 most important java programming interview questions20 most important java programming interview questions
20 most important java programming interview questionsGradeup
 
Advanced Imaging on iOS
Advanced Imaging on iOSAdvanced Imaging on iOS
Advanced Imaging on iOSrsebbe
 
Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Ryan Cuprak
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8Ilya Lapitan
 
Մաթեմատիկա
ՄաթեմատիկաՄաթեմատիկա
ՄաթեմատիկաG-College
 
դաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյանդաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյանwww.mskh.am
 
մաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարանմաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարանnordprocmskh
 
Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Ryan Cuprak
 

Andere mochten auch (18)

Light ViewControllers
Light ViewControllersLight ViewControllers
Light ViewControllers
 
Java. Lecture 01. Introducing Java
Java. Lecture 01. Introducing JavaJava. Lecture 01. Introducing Java
Java. Lecture 01. Introducing Java
 
Open Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeряOpen Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeря
 
Java 8. Lambdas
Java 8. LambdasJava 8. Lambdas
Java 8. Lambdas
 
20 most important java programming interview questions
20 most important java programming interview questions20 most important java programming interview questions
20 most important java programming interview questions
 
Advanced Imaging on iOS
Advanced Imaging on iOSAdvanced Imaging on iOS
Advanced Imaging on iOS
 
Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
մեթոդ և հնար
մեթոդ և հնարմեթոդ և հնար
մեթոդ և հնար
 
Մաթեմատիկա
ՄաթեմատիկաՄաթեմատիկա
Մաթեմատիկա
 
դաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյանդաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյան
 
մաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարանմաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարան
 
ուսուցման մեթոդներ
ուսուցման մեթոդներուսուցման մեթոդներ
ուսուցման մեթոդներ
 
Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]
 
դասվար թեմատիկ պլան
դասվար թեմատիկ պլանդասվար թեմատիկ պլան
դասվար թեմատիկ պլան
 
Բաց դաս
Բաց դասԲաց դաս
Բաց դաս
 
Դասի պլան
Դասի պլանԴասի պլան
Դասի պլան
 
Clean code
Clean codeClean code
Clean code
 

Ähnlich wie Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Objective-C, Антон Буков

Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Ontico
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...JetBrains Russia
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 

Ähnlich wie Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Objective-C, Антон Буков (20)

Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Algo 00
Algo 00Algo 00
Algo 00
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 

Mehr von CocoaHeads

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаCocoaHeads
 
Эффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминЭффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминCocoaHeads
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSCocoaHeads
 
UICollectionView — Александр Зимин
UICollectionView — Александр ЗиминUICollectionView — Александр Зимин
UICollectionView — Александр ЗиминCocoaHeads
 
Push Notifications
Push NotificationsPush Notifications
Push NotificationsCocoaHeads
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевCocoaHeads
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоCocoaHeads
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...CocoaHeads
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...CocoaHeads
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяCocoaHeads
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевCocoaHeads
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировCocoaHeads
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовCocoaHeads
 

Mehr von CocoaHeads (13)

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
 
Эффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминЭффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр Зимин
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOS
 
UICollectionView — Александр Зимин
UICollectionView — Александр ЗиминUICollectionView — Александр Зимин
UICollectionView — Александр Зимин
 
Push Notifications
Push NotificationsPush Notifications
Push Notifications
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
 

Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Objective-C, Антон Буков

  • 1. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Objective-C Антон Буков @k06a Об одной жемчужине Microsoft, портированной на Obj-C...
  • 3. Основные сущности стандартной библиотеки • Коллекции (структуры данных) • Алгоритмы (универсальные и специальные) • Перечислители (iterator, enumerator)
  • 4. Коллекции. (структуры данных) C++ (STL) C# (.NET Framework) Java (Collections Framework) Obj-C (Foundation Framework) Постоянного размера [] std::array Array Array [] NSArray Не зависят от значений vector list stack queue deque List LinkedList Stack Queue ArrayList LinkedList ArrayDeque NSMutableArray NSPointerArray Сравнивают значения set map SortedSet SortedDictionary TreeSet TreeMap NSMutable- OrderedSet Считают хеши и сравнивают значения unordered_set unordered_map Set Dictionary HashSet/ LinkedHashSet HashMap/ LinkedHashMap NSMutableSet NSCountedSet NSHashTable NSMutableDictionary NSMapTable
  • 5. Иерархия коллекций. Интерфейсы C# и Java IEnumerable • GetEnumerator ICollection • Count • Add • Clear • Contains •Remove ISet • bool Add •∩∪⊂⊃ IList • Item[i] • Insert • IndexOf • RemoveAt IDictionary • Item[key] • Add(key,value) • ContainsKey • Remove(key) Collection • iterator • size • add • clear • contains • remove SortedSet • subSet • headSet • tailSet • first • last List • add(i,o) • get • set • indexOf • remove(i) • subList • listIterator Queue • add • element • remove() • offer • peek • poll Set Deque • addF/L • removeF/L • getF/L • offerF/L • peekF/L • pollF/L Map • size • put • clear • containsK/V • remove • entrySet • keySet • values SortedMap • subMap • headMap • tailMap • firstKey
  • 6. Иерархия коллекций. C++ и Obj-C Input iterator Output iterator Forward iterator Bidirectional iterator Random Access iterator NSArray NSMutableArray NSPointerArray NSCountedSet NSDictionary NSMutableDictionary NSSet NSMutableSet NSOrderedSet NSIndexSet NSHashTable NSMutableIndexSet NSMapTable NSMutableOrderedSet
  • 7. Иерархия коллекций. Итераторы в C++ (STL) Категории Характеристика Выражение все Может быть скопирован и создан по образу и подобию X b(a); и b = a; Может быть увеличен на единицу ++a и a++ RA BD FW I Поддерживает сравнение на равенство/неравенство a == b и a != b Может быть разыменован как rvalue для получения значения *a a->m O Может быть разыменован как lvalue для использования слева от знака присваивания *a = t *a++ = t Может быть создан конструктором по-умолчанию X a; Может быть скопирован и использован для повторного обхода X b(a); ++a == ++b Может быть уменьшен на единицу --a и a-- Поддерживает арифметические операции + и - a+n и a—n Поддерживает сравнения (<, >, <= и >=) между итераторами a < b и a <= b Поддерживает операции увеличения += и уменьшения -= a += n и a -= n Поддерживает разыменование по индексу a[n] RA — Random Access iterator BD — Bidirectional iterator I — Input iterator O — Output iterator FW — Forward iterator
  • 8. Перечислители (iterator, enumerator) C++ C# for (auto it = arr.begin(); it != arr.end(); ++it) { std::cout << *it; sum += *it; } // --it, it+n, it-n var en = arr.GetEnumerator(); while (en.MoveNext()) { Console.Write(en.Current); sum += en.Current; } en.Dispose(); // using Java Objective-C Iterator it = arr.iterator(); while (it.hasNext()) { int value = (Integer) it.next(); System.out.print(value); sum += value; } id en = [arr objectEnumerator]; id object; while (object = [en nextObject]) { NSLog(@"%@", object); sum += [object intValue]; }
  • 9. Алгоритмы (1 из 2) C++ (STL) C# (.NET Framework) Java (Collections Framework) Obj-C (Foundation Framework) Работа с множествами merge set_union set_intersect set_difference Union Intersect Except disjoint unionSet minusSet intersectSet removeObjects- InArray Сортировки sort stable_sort partial_sort OrderBy ThenBy OrderByDescending ThenByDescending sort sorted sortedArray* keysSortedBy* Поисковые find search binary_search List.BinarySearch List.Find*** IList.IndexOf Where TakeWhile SkipWhile binarySearch indexOfSubList filter indexOfObject* filterUsing filtered*Using objectsPassingTest NSPredicate NSExpression Аггреагирующие all_of any_of none_of count min max All Any Count Sum Average Min Max frequency min max allMatch anyMatch reduce noneMatch valueForKeyPath @avg @count @max @min @sum
  • 10. Алгоритмы (2 из 2) C++ (STL) C# (.NET Framework) Java (Collections Framework) Obj-C (Foundation Framework) Прочие copy swap transform replace fill generate remove unique reverse rotate shuffle List.Reverse Select Take Skip Enumerable.Repeat Enumerable.Range Distinct Reverse Join GroupBy SelectMany copy swap replaceAll fill reverse rotate shuffle @distinctUnion- OfObjects @unionOfObjects @distinctUnion- OfArrays @unionOfArrays @unionOfSets
  • 11. Пример (1 из 6) • Дано: struct Tweet { id, time, text, url, user_id }; struct User { id, name, nick }; array<Tweet> tweets; map<int,User> userDict; • Найти: Имя пользователя с максимальным числом твитов за фиксированную дату (1 сент 2013), содержащих ссылку в поле url и само количество таких твитов.
  • 12. Пример (2 из 6) С++: map<int,int> countByUserId; for (auto it = tweets.begin(); it != tweets.end(); ++it) if ("2013-09-01" <= it->time && it->time < "2013-09-02") if (it->url != 0) countByUserId[it->user_id]++; auto para = max_element(countByUserId.begin(), countByUserId.end(), [](pair<int,int> a, pair<int,int> b) { return a.second < b.second; }); cout << "User = " << userDict[para.first].name << endl << "Value = " << para.second << endl;
  • 13. Пример (3 из 6) Obj-C: NSMutableDictionary * countByUserId = [NSMutableDictionary dictionary]; for (Tweet * tweet in tweets) if ([@"2013-09-01" compareTo:tweet.time] <= 0 && [tweet.time compareTo:@"2013-09-02"] < 0) if (tweet.url != 0) { int count = [countByUserId[tweet->user_id] intValue]; countByUserId[tweet->user_id] = @(count + 1); } int maxCount = 0; id maxKey = nil; [countByUserId enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { if ([obj intValue] > maxCount) { maxCount = [obj intValue]; maxKey = key; } }]; NSLog(@"User = %@nValue = %d", [userDict[maxKey] name], maxCount);
  • 14. Пример (4 из 6) Java: HashMap<int,int> countByUserId = new HashMap<int,int>(); for (Tweet tweet : tweets) if ("2013-09-01" <= tweet.time && tweet.time < "2013-09-02") if (tweet.url != 0) { int count = countByUserId.get(tweet.user_id); countByUserId.set(tweet->user_id, (count==null?0:count) + 1); } int maxCount = 0; id maxKey = nil; for(Entry<int,int> entry : countByUserId.entrySet()) { if (entry.getValue() > maxCount) { maxCount = entry.getValue(); maxKey = entry.getKey(); } } System.out.format("User = %snValue = %d", userDict.get(maxKey), maxCount);
  • 15. Пример (5 из 6) C#: var group = tweets.Where(t => "2013-09-01" <= t.time && t.time < "2013-09-02") .Where(t => t.url != null) .GroupBy(t => t.user_id) .Max(gr => gr.Count()); Console.WriteLine("User = {0}nValue = {1}", userDict[group.Key].name, group.Count());
  • 16. Пример (6 из 6) Java 8 (java.util.stream): Entry<int,List<int>> entry = tweets.stream() .filter(t -> "2013-09-01" <= t.time && t.time < "2013-09-02") .filter(t -> t.url != null) .groupingBy(t -> t.user_id) // Map<int,List<int>> .entrySet().stream() .max((a,b) -> Int.compare(a.getValue().size(), b.getValue().size())); System.out.format("User = %snValue = %d", userDict.get(entry.getKey()), entry.getValue().size());
  • 17. Пример (7 из 6, ага) Obj-C + NSEnumeratorLinq: var para = [[[[tweets.objectEnumerator where:^(Tweet *t){return [@"2013-09-01" compareTo:t.time] <= 0 && [t.time compareTo:@"2013-09-02"] < 0;}] where:^(Tweet *t){return t.url != null;}] groupBy:^(Tweet *t){return t.user_id;}] max:^(NSKeyValuePair *p){return @([p.value count]);}]; NSLog(@"User = %@nValue = %@", [userDict[para.key] name], [para.value count]);
  • 18. Сравнение архитектур стандартных библиотек С++: • Иерархия итераторов • Алгоритмы универсальные, зависят от категорий итераторов С#: • Иерархия интерфейсов • Алгоритмы универсальные, зависят от интерфейсов, выстраиваются в цепь Java: • Иерархия интерфейсов • Алгоритмы универсальные, зависят от интерфейсов (java.util.Collections) • Алгритмы универсальные, выстраиваются в цепь (java.util.stream) Obj-C: • Иерархия отсутствует, если не считать Immutable-Mutable • Алгоритмы специфичные кроме одного :) [NSEnumerator allObjects]
  • 19. NSEnumeratorLinq • Основные методы: • where, where_i, ofType • select, select_i • distinct • skip, skipWhile • take, takeWhile • groupBy, selectMany • orderBy, orderByDescending • Аккумуляция: • aggregate, elect, elementAt • all, any, none • min, max • sum, average • firstOrDefault, lastOrDefault • Работа с множествами: • concat, concatOne • union, intersect, except • zip • join, groupJoin • Экспорт: • toArray, toSet • toDictionary, toLookup • Дополнительно: • readBytes, readLines • keyValueEnumerator • stringByJoin-withSeparator • enumerateCharacters
  • 20. Полезные ссылки • Collections Programming Guide - https://developer.apple.com/ library/mac/documentation/cocoa/conceptual/Collections/ Collections.html • NSSortDescriptor - http://nshipster.com/nssortdescriptor/ • NSPredicate - http://nshipster.com/nspredicate/ • NSExpression - http://nshipster.com/nsexpression/ • NSOrderedSet - http://nshipster.com/nsorderedset/ • Key-Value Collection Operators — https://developer.apple.com/ library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/ Articles/CollectionOperators.html • https://github.com/robrix/RxCollections • https://github.com/k06a/NSEnumeratorLinq
  • 21. One more thing… • Оператор if-null • Код на C#: string priceStr = priceHolder.get(featureName); PriceLabel.Text = priceStr ?? "$0.99"; • Код на Obj-C: NSDictionary *prices = [self.storeManager pricesDictionary]; NSString *p1 = prices[@"com.identifier1"] ?: @"$0.99";