JavaRush /Блоги Java /Random-TG /Намунаи итератор

Намунаи итератор

Дар гурӯҳ нашр шудааст
Имрӯз мо дар бораи он сӯҳбат хоҳем кард, ки Iterator дар Java чист ва чаро он лозим аст.
Намунаи итератор - 1
Тавре ки шумо аллакай медонед, Java дорои интерфейси аҷиби Коллексия мебошад, ки интерфейси Iterator-ро амалӣ мекунад. Иҷозат диҳед фавран фармоиш диҳам: интерфейси итератор набояд бо намунаи итератор дар Java омехта карда шавад! Ва барои равшан кардан, биёед аввал интерфейсро бубинем.
Айнан, "Итератор" -ро метавон ҳамчун "қувваи бераҳмона " тарҷума кард . Яъне, ин як an objectи муайянест, ки метавонад тавассути тамоми унсурҳои коллексия такрор шавад. Ғайр аз он, он ба шумо имкон медиҳад, ки ин корро бидуни омӯхтани сохтори дохилӣ ва ташкor коллексияҳо анҷом диҳед.
Биёед як сония тасаввур кунем, ки дар Java итератор вуҷуд надорад. Дар ин ҳолат, ҳар як шахс бояд ба умқи коллексияҳо ғарқ шавад ва воқеан дарк кунад, ки ArrayListаз LinkedListва HashSetаз TreeSet.

Усулҳое, ки Iterator бояд татбиқ кунанд

boolean hasNext()— агар дар an objectи такроршаванда (ҳоло Коллексия) арзишҳо боқӣ монанд, усул бармегардад true, агар арзишҳои дигар вуҷуд надошта бошанд false. E next()— элементи навбатии коллекцияро (an objectро) бармегардонад. Агар дигар элементҳо набошанд (ягон чек набуд hasNext()ва next()вақте ки мо ба охири ҷамъоварӣ расидем, занг задем), усул мепартояд NoSuchElementException. void remove()- элементеро, ки охирин аз ҷониби next(). Усул метавонад партояд:
  • UnsupportedOperationException, агар ин итератор методро дастгирӣ накунад remove()(масалан, дар мавриди коллексияҳои танҳо барои хондан)
  • IllegalStateException, агар усул next()то ҳол даъват нашуда бошад, ё агар он remove()аллакай аз занги охирин даъват шуда бошад next().
Ҳамин тавр, итератор барои Рӯйхат татбиқи маъмултарин аст. Итератор аз аввали коллексия то охири он мегузарад: он назар мекунад, ки оё элементи навбатӣ мавҷуд аст ё не ва агар мавҷуд бошад, онро бармегардонад. Дар асоси ин алгоритми оддӣ давра сохта мешавад for-each. Тамдиди он ListIterator мебошад. Биёед усулҳои иловагии итератори рӯйхати java-ро дида бароем. Шумо эҳтимолан онҳоро мешиносед:
  • void add(E e)— як элементро Eба ;List
  • boolean hasPrevious()— бармегардад true, агар Listэлементҳо ҳангоми ҷустуҷӯи баръакс вуҷуд дошта бошанд;
  • int nextIndex()— индекси элементи навбатиро бармегардонад;
  • E previous()— элементи варақи қаблиро бармегардонад;
  • int previousIndex()— индекси элементи қаблиро бармегардонад;
  • void set(E e)- элементеро, ки бо занги охирин баргардонида шудааст next()ё previous()бо элемент иваз мекунад e.
Биёед як мисоли хурдро дида бароем. Биёед як Listсатрҳои табрикиро ба донишҷӯён эҷод кунем:
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Обучающимся");
list.add("На");
list.add("JavaRush");
Ҳоло мо барои он итератор мегирем ва ҳамаи сатрҳои дарбаршударо ба консол чоп мекунем:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
Ҳоло як "монеъшавӣ" вуҷуд хоҳад дошт: Коллексияҳои Java, тавре ки шумо эҳтимол медонед (ва агар шумо намедонед, онро фаҳмед), интерфейсро васеъ кунед, Iterableаммо ин маънои онро надорад, ки танҳо List, Setва Queueитераторро дастгирӣ мекунад. Барои java Map iteratorниз дастгирӣ карда мешавад, аммо бояд даъват карда шавад Map.entrySet():
Map<String, Integer> map = new HashMap<>();
Iterator mapIterator = map.entrySet().iterator();
Он гоҳ усул next() an objectеро бар мегардонад Entry, ки дорои ҷуфти "калид" - "арзиш" аст. Пас ҳама чиз бо List:
while (mapIterator.hasNext()) {
    Map.Entry<String, Integer> entry = mapIterator.next();
    System.out.println("Key: " + entry.getKey());
    System.out.println("Value: " + entry.getValue());
}
Шумо фикр мекунед: «Баста. Мо дар бораи интерфейс гап мезанем ва дар сарлавҳаи мақола "Шаблон" гуфта шудааст. Яъне, намунаи итератор интерфейси Iterator аст? Ё интерфейс як намуна аст? Агар ин калима бори аввал пайдо шавад, ман ба шумо истинод медиҳам: намуна намунаи тарроҳӣ, рафтори муайянест, ки синф ё бисёр синфҳои ба ҳам алоқаманд бояд риоя кунанд. Итератор дар java метавонад барои ҳар як an objectе амалӣ карда шавад, ки сохтори дохorи он итератсияро дар бар мегирад ва шумо метавонед имзои усулҳои муҳокимашударо тағир диҳед. Чизи асосӣ ҳангоми татбиқи намуна мантиқест, ки синф бояд онро риоя кунад. Интерфейси итератор татбиқи хусусии намунаи ҳамон ном буда, ҳам ба сохторҳои тайёр ( List, Set, Queue, Map) ва ҳам барои дигарон мувофиқи салоҳдиди барномасоз истифода мешавад. Бо васеъ кардани интерфейси Iterator, шумо намунаро амалӣ мекунед, аммо барои татбиқи намуна ба шумо лозим нест, ки интерфейсро васеъ кунед. Як мисоли оддӣ: ҳама моҳӣ шино мекунанд, аммо на ҳама чизе, ки шино мекунад моҳӣ аст. Ба унвони мисол, ман қарор додам, ки ... калимаро гирам. Аниқтараш, исм. Он аз қисмҳо иборат аст: префикс, реша, суффикс ва пасванд. Барои қисмҳои калима, мо интерфейс WordPartва синфҳоеро эҷод мекунем, ки онро васеъ мекунанд: Prefix, Root, Suffix и Ending:
interface WordPart {
    String getWordPart();
}

static class Root implements WordPart {

    private String part;

    public Root(String part) {
        this.part = part;
    }

    @Override
    public String getWordPart() {
        return part;
    }
}

static class Prefix implements WordPart {

    private String part;

    public Prefix(String part) {
        this.part = part;
    }

    @Override
    public String getWordPart() {
        return part;
    }
}

static class Suffix implements WordPart {

    private String part;

    public Suffix(String part) {
        this.part = part;
    }

    @Override
    public String getWordPart() {
        return part;
    }
}

static class Ending implements WordPart {

    private String part;

    public Ending(String part) {
        this.part = part;
    }

    @Override
    public String getWordPart() {
        return part;
    }
}
Он гоҳ синф Word(калима) қисмҳоро дар бар мегирад ва ба ғайр аз онҳо мо адади бутун илова мекунем, ки шумораи қисмҳои калимаро инъикос мекунад:
public class Word {

    private Root root;
    private Prefix prefix;
    private Suffix suffix;
    private Ending ending;
    private int partCount;

    public Word(Root root, Prefix prefix, Suffix suffix, Ending ending) {
        this.root = root;
        this.prefix = prefix;
        this.suffix = suffix;
        this.ending = ending;
        this.partCount = 4;
    }

    public Word(Root root, Prefix prefix, Suffix suffix) {
        this.root = root;
        this.prefix = prefix;
        this.suffix = suffix;
        this.partCount = 3;

    }

    public Word(Root root, Prefix prefix) {
        this.root = root;
        this.prefix = prefix;
        this.partCount = 2;
    }

    public Word(Root root) {
        this.root = root;
        this.partCount = 1;
    }

    public Root getRoot() {
        return root;
    }

    public Prefix getPrefix() {
        return prefix;
    }

    public Suffix getSuffix() {
        return suffix;
    }

    public Ending getEnding() {
        return ending;
    }

    public int getPartCount() {
        return partCount;
    }

    public boolean hasRoot() {
        return this.root != null;
    }

    public boolean hasPrefix() {
        return this.prefix != null;
    }

    public boolean hasSuffix() {
        return this.suffix != null;
    }

    public boolean hasEnding() {
        return this.ending != null;
    }
Хуб, мо чор конструктори изофабор дорем (барои соддагӣ, фарз кунем, ки мо танҳо як суффикс дошта метавонем). Исм наметавонад аз як префикс иборат бошад, аз ин рӯ барои конструктори дорои як параметр мо решаро таъин мекунем. Акнун биёед татбиқи намунаи итераторро нависем: WordIterator, 2 усулро барҳам медиҳад: hasNext()ва next():
public class WordIterator implements Iterator<Word.WordPart> {

    private Word word;
    private int wordPartsCount;

    public WordIterator(Word word) {
        this.word = word;
        this.wordPartsCount = word.getPartCount();
    }

    @Override
    public boolean hasNext() {
        if (wordPartsCount == 4) {
            return word.hasPrefix() || word.hasRoot() || word.hasSuffix() || word.hasEnding();
        } else if (wordPartsCount == 3) {
            return word.hasPrefix() || word.hasRoot() || word.hasSuffix();
        } else if (wordPartsCount == 2) {
            return word.hasPrefix() || word.hasRoot();
        } else if (wordPartsCount == 1) {
            return word.hasRoot();
        }
        return false;
    }

    @Override
    public Word.WordPart next() throws NoSuchElementException {
        if (wordPartsCount <= 0) {
            throw new NoSuchElementException("No more elements in this word!");
        }

        try {
            if (wordPartsCount == 4) {
                return word.getEnding();
            }
            if (wordPartsCount == 3) {
                return word.getSuffix();
            }
            if (wordPartsCount == 2) {
                return word.getPrefix();
            }
            return word.getRoot();
        } finally {
            wordPartsCount--;
        }
    }
}
Танҳо ин аст, ки итераторро ба синф таъин кунед Word:
public class Word implements Iterable<Word.WordPart> {@Override
	public Iterator<WordPart>iterator() {
    		return new WordIterator(this);
	}}
Акнун биёед таҳлor морфемикии калимаи «шитоб»-ро гузаронем:
public class Main {
    public static void main(String[] args) {
        Word.Root root = new Word.Root("беж");
        Word.Prefix prefix = new Word.Prefix("пере");
        Word.Suffix suffix = new Word.Suffix("к");
        Word.Ending ending = new Word.Ending("a");

        Word word = new Word(root, prefix, suffix, ending);

        Iterator wordIterator = word.iterator();
        while (wordIterator.hasNext()) {
            Word.WordPart part = (Word.WordPart) wordIterator.next();
            System.out.println(part.getClass() + ": " + part.getWordPart());
        }
    }
}
Лутфан қайд кунед, ки ҳангоми татбиқи намунаи итератор ман тартиби зерини баромадро интихоб кардам:
  1. ба охир мерасад
  2. суффикс
  3. консол
  4. реша
Ҳангоми тарҳрезии итератори худ, шумо метавонед алгоритми такрориро мувофиқи хоҳишатон муайян кунед. Дар таҳсилатон барори кор!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION