10
10
объектов, не раскрывая их внутреннего представления.
11
11
"""
12
12
13
-
14
13
from __future__ import annotations
15
14
from collections .abc import Iterable , Iterator
16
15
from typing import Any
@@ -58,9 +57,22 @@ class AlphabeticalOrderIterator(Iterator):
58
57
def __init__ (self , collection : WordsCollection , reverse : bool = False ) -> None :
59
58
self ._collection = collection
60
59
self ._reverse = reverse
61
- self ._position = - 1 if reverse else 0
60
+ self ._sorted_items = None # Will be set on first __next__ call
61
+ self ._position = 0
62
62
63
63
def __next__ (self ) -> Any :
64
+ """
65
+ EN: Optimization: sorting happens only when the first items is actually
66
+ requested.
67
+
68
+ RU: Оптимизация: сортировка происходит только тогда, когда первый элемент
69
+ впервые запрашивается.
70
+ """
71
+ if self ._sorted_items is None :
72
+ self ._sorted_items = sorted (self ._collection ._collection )
73
+ if self ._reverse :
74
+ self ._sorted_items = list (reversed (self ._sorted_items ))
75
+
64
76
"""
65
77
EN: The __next__() method must return the next item in the sequence. On
66
78
reaching the end, and in subsequent calls, it must raise StopIteration.
@@ -69,12 +81,10 @@ def __next__(self) -> Any:
69
81
последовательности. При достижении конца коллекции и в последующих
70
82
вызовах должно вызываться исключение StopIteration.
71
83
"""
72
- try :
73
- value = self ._collection [self ._position ]
74
- self ._position += - 1 if self ._reverse else 1
75
- except IndexError :
84
+ if self ._position >= len (self ._sorted_items ):
76
85
raise StopIteration ()
77
-
86
+ value = self ._sorted_items [self ._position ]
87
+ self ._position += 1
78
88
return value
79
89
80
90
@@ -120,9 +130,9 @@ def add_item(self, item: Any) -> None:
120
130
# классах Коллекций, в зависимости от уровня косвенности, который вы хотите
121
131
# сохранить в своей программе.
122
132
collection = WordsCollection ()
123
- collection .add_item ("First " )
124
- collection .add_item ("Second " )
125
- collection .add_item ("Third " )
133
+ collection .add_item ("B " )
134
+ collection .add_item ("A " )
135
+ collection .add_item ("C " )
126
136
127
137
print ("Straight traversal:" )
128
138
print ("\n " .join (collection ))
0 commit comments