ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3168

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

В создаваемых классах коллекций можно предоставить блок итератора (iterate block) вместо написания собственного класса итератора для поддержки коллекции.

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

Этот новый подход применяет блоки итераторов. Когда вы пишете класс коллекции, такой как K e y e d L i s t или P r i o r i t y Q u e u e — вы реализуете блок итератора вместо реализации интерфейса I E n u m e r a t o r . Затем пользователи этого класса могут просто итерировать коллекцию с помощью цикла f o r e a c h . Приготовьтесь расстаться с частью вашего драгоценного времени, чтобы ознакомиться с несколькими вариантами блоков итераторов.

Все примеры в этом разделе являются частью демонстрационной програм­ мы I t e r a t o r B l o c k s на прилагаемом компакт-диске.

/ / I t e r a t o r B l o c k s - д е м о н с т р а ц и я п р и м е н е н и я б л о к о в / / и т е р а т о р о в д л я н а п и с а н и я и т е р а т о р о в к о л л е к ц и й

u s i n g S y s t e m ;

n a m e s p a c e

I t e r a t o r B l o c k s

{

 

c l a s s I t e r a t o r B l o c k s

{

/ / M a i n - д е м о н с т р а ц и я п я т и р а з л и ч н ы х п р и л о ж е н и й б л о к о в / / и т е р а т о р о в

s t a t i c v o i d M a i n ( s t r i n g [ ] a r g s )

{

/ / И т е р и р о в а н и е м е с я ц е в г о д а , в ы в о д к о л и ч е с т в а д н е й в / / к а ж д о м и з н и х

M o n t h D a y s m d = n e w M o n t h D a y s ( ) ; / / И т е р и р у е м

C o n s o l e . W r i t e L i n e ( " М е с я ц ы : \ n " ) ; f o r e a c h ( s t r i n g s M o n t h i n md)

{

C o n s o l e . W r i t e L i n e ( s M o n t h ) ;

}

/ / И т е р и р у е м к о л л е к ц и ю с т р о к

S t r i n g C h u n k s s c = n e w S t r i n g C h u n k s ( ) ;

/ / И т е р и р у е м - в ы в о д и м т е к с т , п о м е щ а я к а ж д ы й ф р а г м е н т / / в с в о е й с о б с т в е н н о й с т р о к е

C o n s o l e . W r i t e L i n e ( " \ С т р о к и : \ п " ) ; f o r e a c h ( s t r i n g s C h u n k i n s c )

{

C o n s o l e . W r i t e L i n e ( s C h u n k ) ;

}

/ / А т е п е р ь в ы в о д и м и х в о д н у с т р о к у

C o n s o l e . W r i t e L i n e ( " \ п В ы в о д в о д н у с т р о к у : \ п " ) ; f o r e a c h ( s t r i n g s C h u n k i n s c )

{

C o n s o l e . W r i t e ( s C h u n k ) ;

}

C o n s o l e . W r i t e L i n e ( ) ;

/ / И т е р и р у е м п р о с т ы е ч и с л а д о 1 3

470

Часть VII. Дополнительные главы


Y i e l d B r e a k E x y b = n e w Y i e l d B r e a k E x ( ) ;

/ / И т е р и р у е м , о с т а н а в л и в а я с ь п о с л е 1 3

C o n s o l e . W r i t e L i n e ( " \ п П р о с т ы е

ч и с л а : \ n " ) ;

f o r e a c h

( i n t n P r i m e i n y b )

 

C o n s o l e . W r i t e L i n e ( n P r i m e ) ;

 

}

 

 

/ / И т е р и р у е м ч е т н ы е ч и с л а в у б ы в а ю щ е м п о р я д к е

E v e n N u m b e r s e n = n e w E v e n N u m b e r s ( ) ;

/ / В ы в о д ч е т н ы х ч и с е л о т 1 0 д о 4

C o n s o l e . W r i t e L i n e ( " \ п Ч е т н ы е

ч и с л а : \ п " ) ;

f o r e a c h

( i n t n E v e n i n e n . D e s c e n d i n g E v e n s ( 1 1 , 3 ) )

C o n s o l e . W r i t e L i n e ( n E v e n ) ;

 

}

 

 

/ / И т е р и р у е м ч и с л а т и п а d o u b l e

P r o p e r t y l t e r a t o r p r o p = n e w P r o p e r t y l t e r a t o r ( ) ;

C o n s o l e . W r i t e L i n e ( " \ п Ч и с л а

d o u b l e : \ n " ) ;

f o r e a c h

( d o u b l e d b i n p r o p . D o u b l e P r o p )

C o n s o l e . W r i t e L i n e ( d b ) ;

 

}

 

 

/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я

C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +

 

" з а в е р ш е н и я п р о г р а м м ы . . . " ) ;

C o n s o l e . R e a d ( ) ;

 

}

 

 

}

 

 

/ / К л а с с ы I t e r a t o r B l o c k s

 

/ / M o n t h D a y s -

о п р е д е л я е м и т е р а т о р , к о т о р ы й в о з в р а щ а е т

/ / м е с я ц ы и к о л и ч е с т в о д н е й в н и х

c l a s s

M o n t h D a y s

 

 

 

 

{

 

 

 

 

 

 

s t r i n g [ ] m o n t h s =

 

 

 

{

" J a n u a r y 3 1 " ,

" F e b r u a r y 2 8 " ,

" M a r c h 3 1 " ,

" A p r i l 3 0 " ,

" M a y 3 1 " ,

" J u n e 3 0 " ,

" J u l y 3 1 " ,

" A u g u s t 3 1 " ,

" S e p t e m b e r 3 0 " ,

" O c t o b e r 3 1 " ,

" N o v e m b e r 3 0 " ,

" D e c e m b e r 3 1 "

} ;

 

/ / G e t E n u m e r a t o r - э т о и е с т ь и т е р а т о р

p u b l i c S y s t e m . C o l l e c t i o n s . I E n u m e r a t o r G e t E n u m e r a t o r ( )

{

f o r e a c h ( s t r i n g s M o n t h i n m o n t h s )

{

/ / В о з в р а щ а е м п о о д н о м у

y i e l d r e t u r n s M o n t h ; / /

}

}

}

/ / S t r i n g C h u n k s - о п р е д е л е н и е / / ф р а г м е н т ы т е к с т а

c l a s s S t r i n g C h u n k s

{

м е с я ц у в к а ж д о й и т е р а ц и и

Но в ы й с и н т а к с и с

ит е р а т о р а , в о з в р а щ а ю щ е г о

/ / G e t E n u m e r a t o r - и т е р а т о р . О б р а т и т е в н и м а н и е , к а к о н / / ( д в а ж д ы ) в ы з ы в а е т с я в M a i n

Глава 20. Работа с коллекциями

471


p u b l i c S y s t e m . C o l l e c t i o n s . I E n u m e r a t o r G e t E n u m e r a t o r ( )

{

/ / В о з в р а т р а з н ы х ф р а г м е н т о в

y i e l d

r e t u r n

" U s i n g

i t e r a t o r

y i e l d

r e t u r n

" b l o c k s

" ;

 

y i e l d

r e t u r n

" i s n ' t

a l l

" ;

y i e l d

r e t u r n

" t h a t

h a r d " ;

y i e l d

r e t u r n

" . " ;

 

 

т е к с т а н а к а ж д о й и т е р а ц и и " ;

}

}

/ / Y i e l d B r e a k E x - п р и м е р и с п о л ь з о в а н и я к л ю ч е в о г о с л о в а / / y i e l d b r e a k

c l a s s Y i e l d B r e a k E x

{

i n t [ ] p r i m e s = { 2 , 3 , 5 , 7 , 1 1 , 1 3 , 1 7 , 1 9 , 2 3 } ;

/ / G e t E n u m e r a t o r - в о з в р а т п о с л е д о в а т е л ь н о с т и п р о с т ы х / / ч и с е л с д е м о н с т р а ц и е й п р и м е н е н и я к о н с т р у к ц и и y i e l d / / b r e a k

p u b l i c S y s t e m . C o l l e c t i o n s . I E n u m e r a t o r G e t E n u m e r a t o r ( )

{

f o r e a c h ( i n t n P r i m e i n p r i m e s )

{

i f ( n P r i m e >

y i e l d r e t u r n

}

}

}

1 3 ) y i e l d b r e a k ; / / Н о в ы й с и н т а к с и с n P r i m e ;

/ / E v e n N u m b e r s - ч и с л о в о й / / ч и с л а м е ж д у г р а н и ч н ы м и c l a s s E v e n N u m b e r s

{

и т е р а т о р , в о з в р а щ а ю щ и й ч е т н ы е з н а ч е н и я м и в у б ы в а ю щ е м п о р я д к е

/ / D e s c e n d i n g E v e n s - " и м е н о в а н н ы й " и т е р а т о р , к о т о р ы й

/ / т а к ж е д е м о н с т р и р у е т и с п о л ь з о в а н и е к о н с т р у к ц и и y i e l d

/ / b r e a k

 

 

p u b l i c

S y s t e m . C o l l e c t i o n s . I E n u m e r a b l e

{

D e s c e n d i n g E v e n s ( i n t n T o p , i n t n S t o p )

/ / Н а ч и н а е м с б л и ж а й ш е г о к n T o p м е н ь ш е г о ч е т н о г о ч и с л а

if

( n T o p

%

2 != 0)

 

n T o p

 

- =

1 ;

/ / И т е р и р у е м д о

б л и ж а й ш е г о к n S t o p ч е т н о г о ч и с л а ,

/ / п р е в ы ш а ю щ е г о

э т о з н а ч е н и е

f o r

( i n t i = n T o p ; i > = n S t o p ; i - = 2 )

{

 

 

i f

( i < n S t o p )

y i e l d b r e a k ;

/ / В о з в р а щ а е м н а к а ж д о й и т е р а ц и и о ч е р е д н о е ч е т н о е / / ч и с л о

y i e l d r e t u r n i ;

}

}

}

/ / P r o p e r t y l t e r a t o r - / / к л а с с а в к а ч е с т в е

р е а л и з а ц и я ф у н к ц и и д о с т у п а с в о й с т в а б л о к а и т е р а т о р а

472

Часть VII. Дополнительные главы



c l a s s

P r o p e r t y l t e r a t o r

{

 

 

d o u b l e t ]

d o u b l e s = { 1 . 0 , 2 . 0 , 3 . 5 , 4 . 6 7 } ;

/ / D o u b l e P r o p - с в о й с т в о " g e t " с б л о к о м и т е р а т о р а p u b l i c S y s t e m . C o l l e c t i o n s . I E n u m e r a b l e D o u b l e P r o p

g e t

 

 

{

 

 

f o r e a c h

( d o u b l e

d b i n d o u b l e s )

{

 

 

y i e l d

r e t u r n

d b ;

}

Итерация месяцев

Следующий фрагмент и з демонстрационной

программы I t e r a t o r B l o c k s предо­

ставляет итератор, который проходит по месяцам года:

/ / M o n t h D a y s - о п р е д е л я е м и т е р а т о р , к о т о р ы й в о з в р а щ а е т

/ / м е с я ц ы и к о л и ч е с т в о д н е й в н и х

 

c l a s s M o n t h D a y s

 

 

 

{

 

 

 

 

 

s t r i n g [ ]

m o n t h s =

 

 

{ " J a n u a r y 3 1 " ,

" F e b r u a r y 2 8 " ,

" M a r c h 3 1 " ,

" A p r i l 3 0 " ,

" M a y 3 1 " , " J u n e 3 0 " ,

" J u l y 3 1 " ,

" A u g u s t 3 1 " ,

" S e p t e m b e r 3 0 " ,

" O c t o b e r 3 1 " ,

" N o v e m b e r 3 0 " ,

" D e c e m b e r 3 1 "

} ;

 

/ / G e t E n u m e r a t o r - э т о и е с т ь и т е р а т о р

p u b l i c

S y s t e m . C o l l e c t i o n s . I E n u m e r a t o r G e t E n u m e r a t o r ( )

{

 

 

 

 

 

f o r e a c h ( s t r i n g

s M o n t h i n m o n t h s )

 

{

/ / В о з в р а щ а е м п о о д н о м у м е с я ц у в к а ж д о й и т е р а ц и и y i e l d r e t u r n s M o n t h ; / / Н о в ы й с и н т а к с и с

}

}

А вот часть функции M a i n ( ) , где выполняется итерирование этой коллекции с при­

менением цикла f o r e a c h :

/ / И т е р и р о в а н и е м е с я ц е в г о д а , в ы в о д к о л и ч е с т в а д н е й в / / к а ж д о м и з н и х

M o n t h D a y s m d = n e w M o n t h D a y s ( ) ; / / И т е р и р у е м

C o n s o l e . W r i t e L i n e ( " М е с я ц ы : \ n " ) ; f o r e a c h ( s t r i n g s M o n t h i n md)

{

C o n s o l e . W r i t e L i n e ( s M o n t h ) ;

Глава 20. Работа с коллекциями

473