SlideShare a Scribd company logo
1 of 21
Download to read offline
Алгоритмы и коллекции
стандартных библиотек
C++, C#, Java, Objective-C

Об одной жемчужине Microsoft,
портированной на Obj-C...

Антон Буков
@k06a
Основные сущности
стандартной библиотеки
•

Коллекции (структуры данных)

•

Алгоритмы (универсальные и специальные)

•

Перечислители (iterator, enumerator)
Коллекции.
(структуры данных)
C++
(STL)

Постоянного
размера
Не зависят
от значений

Сравнивают
значения
Считают хеши
и сравнивают
значения

C#
(.NET Framework)

[]
std::array

Array

unordered_set
unordered_map

Obj-C

(Collections Framework) (Foundation Framework)

Array

[]
NSArray

ArrayList
LinkedList
ArrayDeque

NSMutableArray
NSPointerArray

SortedSet
SortedDictionary

TreeSet
TreeMap

NSMutableOrderedSet

Set
Dictionary

HashSet/
LinkedHashSet
HashMap/
LinkedHashMap

NSMutableSet
NSCountedSet
NSHashTable
NSMutableDictionary
NSMapTable

vector list stack List LinkedList
queue deque
Stack Queue
set
map

Java
Иерархия коллекций.
Интерфейсы C# и Java
IEnumerable

Collection

Map

• iterator

• clear

• bool Add
• ∩∪⊂⊃

• containsK/V
• remove

• remove

• Count

• clear

• contains

ISet

• put

• add

ICollection

• size

• size

• GetEnumerator

• entrySet

• Add

• keySet

• Clear

• values

• Contains
• Remove

Queue

Set

• add

IList

IDictionary

• Item[i]

• Item[key]

• Insert

• Add(key,value)

• IndexOf

• ContainsKey

• RemoveAt

• Remove(key)

• element
• remove()
• offer
• peek
• poll

List

Deque

• add(i,o)

SortedSet
• subSet
• headSet
• tailSet
• first
• last

• addF/L

• get

• removeF/L

• set

• getF/L

• indexOf

• offerF/L

• remove(i)

• peekF/L

• subList

• pollF/L

• listIterator

SortedMap
• subMap
• headMap
• tailMap
• firstKey
NSArray
Input
iterator

Output
iterator

Forward
iterator

NSSet

NSMutableArray

NSMutableSet

NSPointerArray

NSCountedSet

NSHashTable

Иерархия коллекций.
C++ и Obj-C

NSOrderedSet
Bidirectional
iterator
Random
Access
iterator

NSDictionary
NSMutableDictionary

NSMapTable

NSMutableOrderedSet
NSIndexSet
NSMutableIndexSet
Иерархия коллекций.
Итераторы в C++ (STL)
Категории

O

X b(a); и b = a;

Может быть увеличен на единицу

I

BD

Выражение

Может быть скопирован и создан по образу и подобию

все

FW

Характеристика

++a и a++

Поддерживает сравнение на равенство/неравенство

a == b и a != b

Может быть разыменован как rvalue для получения значения

*a"
a->m
*a = t"

Может быть разыменован как lvalue для использования слева от
знака присваивания
Может быть создан конструктором по-умолчанию

*a++ = t
X a;

Может быть уменьшен на единицу
Поддерживает арифметические операции + и -

a+n и a—n

Поддерживает сравнения (<, >, <= и >=) между итераторами

a < b и a <= b

Поддерживает операции увеличения += и уменьшения -=

a += n и a -= n

Поддерживает разыменование по индексу

RA

X b(a);"
++a == ++b
--a и a--

a[n]

Может быть скопирован и использован для повторного обхода

RA — Random Access iterator ! I" — Input iterator!
BD" — Bidirectional iterator!
O" — Output iterator!

FW — Forward iterator!
Перечислители
(iterator, enumerator)
C++
for	
  (auto	
  it	
  =	
  arr.begin();	
  
	
  	
  	
  	
  	
  it	
  !=	
  arr.end();	
  ++it)	
  
{	
  
	
  	
  	
  	
  std::cout	
  <<	
  *it;	
  
	
  	
  	
  	
  sum	
  +=	
  *it;	
  
}	
  
//	
  -­‐-­‐it,	
  it+n,	
  it-­‐n

Java

C#
var	
  en	
  =	
  arr.GetEnumerator();	
  
while	
  (en.MoveNext())	
  
{	
  
	
  	
  	
  	
  Console.Write(en.Current);	
  
	
  	
  	
  	
  sum	
  +=	
  en.Current;	
  
}	
  
en.Dispose();	
  //	
  using

Objective-C

Iterator	
  it	
  =	
  arr.iterator();	
  
id	
  en	
  =	
  [arr	
  objectEnumerator];	
  
while	
  (it.hasNext())	
  
id	
  object;	
  
{	
  
while	
  (object	
  =	
  [en	
  nextObject])	
  
	
  	
  	
  	
  int	
  value	
  =	
  (Integer)	
  it.next();	
   {	
  
	
  	
  	
  	
  System.out.print(value);	
  
	
  	
  	
  	
  NSLog(@"%@",	
  object);	
  
	
  	
  	
  	
  sum	
  +=	
  value;	
  
	
  	
  	
  	
  sum	
  +=	
  [object	
  intValue];	
  
}
}
Алгоритмы
(1 из 2)
C++
(STL)

Работа с
множествами

C#
(.NET Framework)

merge set_union
Union Intersect
set_intersect
Except
set_difference

Java

Obj-C

(Collections Framework) (Foundation Framework)

disjoint

unionSet minusSet
intersectSet
removeObjectsInArray

sortedArray*
keysSortedBy*

sort stable_sort
partial_sort

OrderBy ThenBy
OrderByDescending
ThenByDescending

sort sorted

find search
binary_search

List.BinarySearch
List.Find***
IList.IndexOf
Where TakeWhile
SkipWhile

binarySearch
indexOfSubList
filter

all_of any_of
Аггреагирующие none_of count
min max

All Any Count
Sum Average
Min Max

valueForKeyPath
frequency
@avg @count
min max allMatch
anyMatch reduce
@max @min
noneMatch
@sum

Сортировки

Поисковые

indexOfObject*
filterUsing filtered*Using
objectsPassingTest

NSPredicate
NSExpression
Алгоритмы
(2 из 2)
C++
(STL)

Прочие

C#
(.NET 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

Java

Obj-C

(Collections Framework) (Foundation Framework)

copy
swap
replaceAll
fill
reverse
rotate
shuffle

@distinctUnionOfObjects
@unionOfObjects
@distinctUnionOfArrays
@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

•

concat, concatOne

•

select, select_i

•

union, intersect, except

•

distinct

•

zip

•

skip, skipWhile

•

join, groupJoin

•

take, takeWhile

•
•
•

groupBy, selectMany

•

orderBy, orderByDescending

Экспорт:
•
•

Аккумуляция:
•

toArray, toSet
toDictionary, toLookup

Дополнительно:

•

aggregate, elect, elementAt

•

all, any, none

•

readBytes, readLines

•

min, max

•

keyValueEnumerator

•

sum, average

•

stringByJoin-withSeparator

•

firstOrDefault, lastOrDefault

•

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";

More Related Content

What's hot

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptDenis Latushkin
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Быстрые конструкции в 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
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CИнтуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CГлеб Тарасов
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Platonov Sergey
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETAndrey Akinshin
 

What's hot (19)

Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Javascript
JavascriptJavascript
Javascript
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в Javascript
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CИнтуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 

Viewers also liked

Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Technopark
 
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017Andrey Karpov
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionIn a Rocket
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting PersonalKirsty Hulse
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanPost Planner
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldabaux singapore
 

Viewers also liked (7)

Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
 
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media Plan
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika AldabaLightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
 

Similar to AlgoCollections (RUS)

Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...JetBrains Russia
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.MageCloud
 

Similar to AlgoCollections (RUS) (20)

Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
Erlang
ErlangErlang
Erlang
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Algo 00
Algo 00Algo 00
Algo 00
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Scala for android
Scala for androidScala for android
Scala for android
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.
 

AlgoCollections (RUS)

  • 1. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Objective-C Об одной жемчужине Microsoft, портированной на Obj-C... Антон Буков @k06a
  • 2.
  • 3. Основные сущности стандартной библиотеки • Коллекции (структуры данных) • Алгоритмы (универсальные и специальные) • Перечислители (iterator, enumerator)
  • 4. Коллекции. (структуры данных) C++ (STL) Постоянного размера Не зависят от значений Сравнивают значения Считают хеши и сравнивают значения C# (.NET Framework) [] std::array Array unordered_set unordered_map Obj-C (Collections Framework) (Foundation Framework) Array [] NSArray ArrayList LinkedList ArrayDeque NSMutableArray NSPointerArray SortedSet SortedDictionary TreeSet TreeMap NSMutableOrderedSet Set Dictionary HashSet/ LinkedHashSet HashMap/ LinkedHashMap NSMutableSet NSCountedSet NSHashTable NSMutableDictionary NSMapTable vector list stack List LinkedList queue deque Stack Queue set map Java
  • 5. Иерархия коллекций. Интерфейсы C# и Java IEnumerable Collection Map • iterator • clear • bool Add • ∩∪⊂⊃ • containsK/V • remove • remove • Count • clear • contains ISet • put • add ICollection • size • size • GetEnumerator • entrySet • Add • keySet • Clear • values • Contains • Remove Queue Set • add IList IDictionary • Item[i] • Item[key] • Insert • Add(key,value) • IndexOf • ContainsKey • RemoveAt • Remove(key) • element • remove() • offer • peek • poll List Deque • add(i,o) SortedSet • subSet • headSet • tailSet • first • last • addF/L • get • removeF/L • set • getF/L • indexOf • offerF/L • remove(i) • peekF/L • subList • pollF/L • listIterator SortedMap • subMap • headMap • tailMap • firstKey
  • 6. NSArray Input iterator Output iterator Forward iterator NSSet NSMutableArray NSMutableSet NSPointerArray NSCountedSet NSHashTable Иерархия коллекций. C++ и Obj-C NSOrderedSet Bidirectional iterator Random Access iterator NSDictionary NSMutableDictionary NSMapTable NSMutableOrderedSet NSIndexSet NSMutableIndexSet
  • 7. Иерархия коллекций. Итераторы в C++ (STL) Категории O X b(a); и b = a; Может быть увеличен на единицу I BD Выражение Может быть скопирован и создан по образу и подобию все FW Характеристика ++a и a++ Поддерживает сравнение на равенство/неравенство a == b и a != b Может быть разыменован как rvalue для получения значения *a" a->m *a = t" Может быть разыменован как lvalue для использования слева от знака присваивания Может быть создан конструктором по-умолчанию *a++ = t X a; Может быть уменьшен на единицу Поддерживает арифметические операции + и - a+n и a—n Поддерживает сравнения (<, >, <= и >=) между итераторами a < b и a <= b Поддерживает операции увеличения += и уменьшения -= a += n и a -= n Поддерживает разыменование по индексу RA X b(a);" ++a == ++b --a и a-- a[n] Может быть скопирован и использован для повторного обхода RA — Random Access iterator ! I" — Input iterator! BD" — Bidirectional iterator! O" — Output iterator! FW — Forward iterator!
  • 8. Перечислители (iterator, enumerator) C++ for  (auto  it  =  arr.begin();            it  !=  arr.end();  ++it)   {          std::cout  <<  *it;          sum  +=  *it;   }   //  -­‐-­‐it,  it+n,  it-­‐n Java C# var  en  =  arr.GetEnumerator();   while  (en.MoveNext())   {          Console.Write(en.Current);          sum  +=  en.Current;   }   en.Dispose();  //  using Objective-C Iterator  it  =  arr.iterator();   id  en  =  [arr  objectEnumerator];   while  (it.hasNext())   id  object;   {   while  (object  =  [en  nextObject])          int  value  =  (Integer)  it.next();   {          System.out.print(value);          NSLog(@"%@",  object);          sum  +=  value;          sum  +=  [object  intValue];   } }
  • 9. Алгоритмы (1 из 2) C++ (STL) Работа с множествами C# (.NET Framework) merge set_union Union Intersect set_intersect Except set_difference Java Obj-C (Collections Framework) (Foundation Framework) disjoint unionSet minusSet intersectSet removeObjectsInArray sortedArray* keysSortedBy* sort stable_sort partial_sort OrderBy ThenBy OrderByDescending ThenByDescending sort sorted find search binary_search List.BinarySearch List.Find*** IList.IndexOf Where TakeWhile SkipWhile binarySearch indexOfSubList filter all_of any_of Аггреагирующие none_of count min max All Any Count Sum Average Min Max valueForKeyPath frequency @avg @count min max allMatch anyMatch reduce @max @min noneMatch @sum Сортировки Поисковые indexOfObject* filterUsing filtered*Using objectsPassingTest NSPredicate NSExpression
  • 10. Алгоритмы (2 из 2) C++ (STL) Прочие C# (.NET 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 Java Obj-C (Collections Framework) (Foundation Framework) copy swap replaceAll fill reverse rotate shuffle @distinctUnionOfObjects @unionOfObjects @distinctUnionOfArrays @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 • concat, concatOne • select, select_i • union, intersect, except • distinct • zip • skip, skipWhile • join, groupJoin • take, takeWhile • • • groupBy, selectMany • orderBy, orderByDescending Экспорт: • • Аккумуляция: • toArray, toSet toDictionary, toLookup Дополнительно: • aggregate, elect, elementAt • all, any, none • readBytes, readLines • min, max • keyValueEnumerator • sum, average • stringByJoin-withSeparator • firstOrDefault, lastOrDefault • 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";