Toshkent axborot texnalogiyalar universteti


Download 17.27 Kb.
bet2/2
Sana18.06.2023
Hajmi17.27 Kb.
#1593444
1   2
Bog'liq
Shavkatov Dt arxitekturas

ListIterator sinfi collection nomli to'plam ob'ektiga bog'langan iteratorni ifodalaydi. __next__() metodi to'plamning har bir elementini qaytaradi va indeksni oshiradi. SetIterator sinfi esa collection nomli to'plam ob'ektiga bog'langan iteratorni ifodalaydi, lekin elementlarni set yordamida saqlayadi va har bir qadamda bir elementni to'plamdan olib tashlaydi.
Bu sinflar orqali, bir list yoki to'plam ob'ektiga iterator sifatida murojaat qilish imkoniyatiga ega bo'lasiz. Misol uchun:
my_list = [1, 2, 3, 4, 5]
list_iterator = ListIterator(my_list)

for element in list_iterator:


print(element)

my_set = {10, 20, 30, 40, 50}


set_iterator = SetIterator(my_set)

for element in set_iterator:


print(element)
Bu kodlar orqali my_list va my_set ob'ektlaridan elementlarni iterator orqali olish imkoniyatiga ega bo'lasiz.
1. Iteratorlar uchun umumiy interfeys yarating. Kerakli minimal - bu to'plamning keyingi elementini olish operatsiyasi. Lekin qulaylik uchun siz boshqa narsani taqdim etishingiz mumkin. Masalan, oldingi elementni olish usullari, joriy pozitsiya, o'tishning oxirini tekshirish va boshqalar.
java
public interface Collection {
Iterator iterator(); // to'plamni aylanib o'tish uchun iteratorni olish
void add(T item); // to'plamga element qo'shish
void remove(T item); // to'plamdan elementni olib tashlash
boolean contains(T item); // to'plamda element mavjudligini tekshirish
int size(); // to'plamdagi elementlar sonini olish
}
Bu interfeys umumiy Iterator interfeysini qaytaruvchi iterator() usulini belgilaydi. Bu mijoz kodiga Iterator interfeysini amalga oshiradigan har qanday sinfdan uning aniq turini bilmasdan foydalanish imkonini beradi.
“Iterator()” usuliga qo'shimcha ravishda to'plam bilan ishlashning boshqa usullarini to'plam interfeysida aniqlash mumkin, masalan:
- add(T item) - to'plamga element qo'shadi.
- remove(T item) - to'plamdan elementni olib tashlaydi.
- contains(T item) - to'plamda element mavjudligini tekshiradi.
- size() - to'plamdagi elementlar sonini qaytaradi.
Ushbu usullarni amalga oshirish muayyan to'plamga bog'liq. Masalan, “add()” usuli o‘zgarmas to‘plamda qo‘llab-quvvatlanmasligi mumkin va “contains()” usuli murakkab elementlarni qidirish mantiqini talab qilishi mumkin.
2. Shablon bilan o'tmoqchi bo'lgan to'plamlar uchun maxsus iterator sinflarini yarating. Iterator faqat bitta to'plam ob'ektiga bog'langan bo'lishi kerak. Odatda bu munosabatlar konstruktor orqali o'rnatiladi.
Java tilida to'plamlar uchun maxsus iteratorlarni amalga oshirishga misol:
java
// Iterator interfeysi
public interface Iterator {
boolean hasNext(); // keyingi element mavjudligini tekshirish
T next(); // keyingi elementni olish
}
// Ro'yxat uchun maxsus iterator
public class ListIterator implements Iterator {
private List list; // ob'ekt havolasi ro'yxati
private int position; // joriy iterator pozitsiyasi
public ListIterator(List list) {
this.list = list;
this.position = 0;
}
public boolean hasNext() {
return position < list.size();
}
public T next() {
T element = list.get(position);
position++;
return element;
}
}
// Massiv uchun maxsus iterator
public class ArrayIterator implements Iterator {
private T[] array; // massiv ob'ektiga havola
private int position; // joriy iterator pozitsiyasi
public ArrayIterator(T[] array) {
this.array = array;
this.position = 0;
}
public boolean hasNext() {
return position < array.length;
}
public T next() {
T element = array[position];
position++;
return element;
} }
Bu sinflar Iterator interfeysida belgilangan hasNext() va next() usullarini amalga oshiradi. ListIterator va ArrayIterator aniq iteratorlari ma`lum to`plam turlariga bog`langan - mos ravishda ro`yxat va massiv. Iterator va to'plam o'rtasidagi munosabatlar konstruktor orqali o'rnatiladi.
Shunday qilib, mijoz kodi Iterator interfeysini amalga oshiradigan har qanday sinfdan foydalanishi mumkin, shu jumladan turli to'plam turlari uchun maxsus iteratorlar.
3. Maxsus yig'ish sinflarida iterator olish usullarini qo'llash. Ular berilgan to'plam turi bilan ishlashga qodir bo'lgan sinfning yangi iteratorini yaratishlari kerak. To'plam o'z ob'ektiga havolani iterator konstruktoriga o'tkazishi kerak.
Maxsus yig'ish sinflari ma'lum bir iterator ob'ektini qaytaradigan iterator oluvchini amalga oshirishi kerak. Ushbu usul berilgan to'plam turida ishlay oladigan yangi iterator yaratishi va uni to'plamning o'ziga havola qilishi kerak.
Massiv sinfida (Array) iterator getter usulini amalga oshirishga misol:
javascript
class ArrayIterator {
constructor(array) {
this.array = array;
this.index = 0;
}
hasNext() {
return this.index < this.array.length;
}
next() {
return this.array[this.index++];
}
}
class MyArray {
constructor() {
this.array = [];
}
add(item) {
this.array.push(item);
}
[Symbol.iterator]() {
return new ArrayIterator(this.array);
} }
const myArray = new MyArray();
myArray.add(1);
myArray.add(2);
myArray.add(3);
const iterator = myArray[Symbol.iterator]();
while (iterator.hasNext()) {
console.log(iterator.next());
}
Ushbu misolda "ArrayIterator" klassi umumiy iterator interfeysini amalga oshiradi va "MyArray" klassi ma'lum bir to'plamni ifodalaydi. Symbol.iterator() usuli joriy massivda ishlaydigan yangi ArrayIterator obyektini qaytaradi.
4. Mijoz kodi va yig'ish sinflarida hech qanday element o'tish kodi qolmasligi kerak. Mijoz har safar uning elementlarini takrorlashi kerak bo'lganda yig'ish ob'ektidan yangi iteratorni olishi kerak.
ArrayList to'plamidan foydalangan holda Java tilida Iterator shablonini amalga oshirishga misol:
java
import java.util.ArrayList;
import java.util.Iterator;
public class MyCollection implements Iterable {
private ArrayList items = new ArrayList<>();
public void addItem(String item) {
items.add(item);
}
@Override
public Iterator iterator() {
return new MyIterator(items);
}
private class MyIterator implements Iterator {
private ArrayList items;
private int position;
public MyIterator(ArrayList items) {
this.items = items;
this.position = 0;
}
@Override
public boolean hasNext() {
return position < items.size();
}
@Override
public String next() {
String item = items.get(position);
position++;
return item;
}
}
}
Ushbu misolda "MyCollection" "Iterator()" usulini amalga oshirishni talab qiluvchi "Iterable" interfeysini qo'llaydi. “Iterator()” usuli “Iterator” interfeysini amalga oshiradigan “MyIterator” obyektini qaytaradi.
"MyIterator" iteratori elementlarni saqlash uchun "ArrayList" to'plamidan foydalanadi va ikkita usul mavjud: "hasNext()" va "keyingi()'. hasNext() usuli keyingi element mavjudligini tekshiradi va keyingi() usuli to`plamdagi keyingi elementni qaytaradi.
Mijoz kodida to'plam elementlarini takrorlash uchun biz "iterator()" usulini ichkarida chaqiradigan "for-each" tsiklidan foydalanishimiz mumkin:
java
MyCollection collection = new MyCollection();
collection.addItem("item 1");
collection.addItem("item 2");
collection.addItem("item 3");
for (String item : collection) {
System.out.println(item);
}
To'plam elementlarini takrorlash uchun har safar "for-each" dan foydalansak, biz to'plam ob'ektidan yangi iteratorni olamiz.

Download 17.27 Kb.

Do'stlaringiz bilan baham:
1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling