JavaRush /Blog Jawa /Random-JV /Pola iterator

Pola iterator

Diterbitake ing grup
Dina iki kita bakal ngomong babagan apa Iterator ing Jawa lan apa sing dibutuhake.
Pola iterator - 1
Sing mbokmenawa wis ngerti, Jawa nduweni antarmuka Koleksi apik sing ngleksanakake antarmuka Iterator. Ayo kula nggawe reservasi langsung: antarmuka iterator ngirim ora bingung karo pola iterator ing Jawa! Lan kanggo njlentrehake, ayo goleki antarmuka.
Secara harfiah, "Iterator" bisa diterjemahake minangka "kekuatan kasar . " Sing, iku entitas tartamtu sing bisa iterate liwat kabeh unsur ing koleksi. Kajaba iku, ngidini sampeyan nindakake iki tanpa nyelidiki struktur internal lan susunan koleksi.
Coba mbayangno sedhela yen ora ana iterator ing Jawa. Ing kasus iki, saben wong kudu nyilem menyang paling jero saka koleksi lan ngerti apa beda ArrayListsaka LinkedListlan HashSetsaka TreeSet.

Metode sing kudu ditindakake Iterator

boolean hasNext()— yen isih ana nilai sing isih ana ing obyek sing bisa diulang (saiki dadi Koleksi), metode kasebut bakal bali true, yen ora ana nilai maneh false. E next()- ngasilake unsur sabanjure koleksi (obyek). Yen ora ana unsur liyane (ora ana mriksa hasNext(), lan kita disebut next()nalika kita tekan mburi koleksi), cara bakal uncalan NoSuchElementException. void remove()- bakal mbusak unsur sing pungkasan dijupuk dening next(). Cara kasebut bisa mbatalake:
  • UnsupportedOperationException, yen iterator iki ora ndhukung metode kasebut remove()(umpamane koleksi mung diwaca, contone)
  • IllegalStateException, yen cara next()durung disebut, utawa yen remove()wis disebut wiwit telpon pungkasan next().
Dadi, iterator kanggo List minangka implementasine sing paling umum. Iterator wiwit saka wiwitan koleksi nganti pungkasan: katon yen ana unsur sabanjure lan bali yen ana. Siklus dibangun kanthi basis algoritma sing prasaja iki for-each. Ekstensi kasebut yaiku ListIterator. Ayo goleki metode iterator dhaptar java tambahan. Sampeyan bisa uga ngerti dheweke:
  • void add(E e)- nglebokake unsur Emenyang ;List
  • boolean hasPrevious()- bakal bali trueyen Listana unsur sajrone telusuran mbalikke;
  • int nextIndex()- bakal ngasilake indeks saka unsur sabanjure;
  • E previous()- bakal ngasilake unsur sheet sadurunge;
  • int previousIndex()- bakal ngasilake indeks saka unsur sadurunge;
  • void set(E e)- bakal ngganti unsur bali dening telpon pungkasan next()utawa previous()karo unsur e.
Ayo katon ing conto cilik. Gawea Listukara kang isine salam marang siswa:
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Обучающимся");
list.add("На");
list.add("JavaRush");
Saiki kita bakal entuk iterator lan nyithak kabeh garis sing ana ing konsol:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
Saiki bakal ana "bottleneck": Koleksi Jawa, sing mbokmenawa ngerti (lan yen sampeyan ora ngerti, tokoh metu), ngluwihi antarmuka Iterable, nanging iki ora ateges mung List, Setlan Queuendhukung iterator. Kanggo java Map iteratoruga didhukung, nanging kudu diarani Map.entrySet():
Map<String, Integer> map = new HashMap<>();
Iterator mapIterator = map.entrySet().iterator();
Banjur cara next() bakal ngasilake obyek Entrysing ngemot pasangan "kunci" - "nilai". Banjur kabeh padha karo List:
while (mapIterator.hasNext()) {
    Map.Entry<String, Integer> entry = mapIterator.next();
    System.out.println("Key: " + entry.getKey());
    System.out.println("Value: " + entry.getValue());
}
Sampeyan mikir: "Sampun. Kita ngomong babagan antarmuka, lan judhul artikel kasebut "Pola". Yaiku, pola iterator yaiku antarmuka Iterator? Utawa antarmuka minangka pola? Yen tembung iki katon pisanan, aku menehi referensi: pola minangka pola desain, prilaku tartamtu sing kelas utawa akeh kelas sing saling gegandhengan kudu dipatuhi. Iterator ing java bisa dileksanakake kanggo obyek apa wae sing struktur internal kalebu iterasi, lan sampeyan bisa ngganti tandha saka metode sing dibahas. Sing utama nalika ngetrapake pola yaiku logika sing kudu dipatuhi kelas. Antarmuka iterator minangka implementasi pribadi saka pola kanthi jeneng sing padha, ditrapake kanggo struktur sing wis siap ( List, Set, Queue, Map), lan liya-liyane, miturut kawicaksanan programmer. Kanthi ndawakake antarmuka Iterator, sampeyan ngleksanakake pola, nanging sampeyan ora perlu ngluwihi antarmuka kanggo ngleksanakake pola kasebut. Analogi prasaja: kabeh iwak nglangi, nanging ora kabeh sing nglangi iku iwak. Minangka conto, aku mutusake kanggo njupuk ... tembung. Luwih khusus, tembung. Iku kasusun saka bagean: ater-ater, root, sufiks lan pungkasan. Kanggo bagean saka tembung, kita bakal nggawe antarmuka WordPartlan kelas sing ngluwihi: 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;
    }
}
Banjur kelas Word(tembung) bakal ngemot bagean, lan saliyane iku, kita bakal nambah integer sing nggambarake jumlah bagean ing tembung kasebut:
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;
    }
Oke, kita duwe papat konstruktor overloaded (kanggo gamblang, ayo nganggep kita mung bisa duwe siji seselan). Tembung ora bisa kalebu siji awalan, mula kanggo konstruktor kanthi siji parameter kita bakal nyetel root. Saiki ayo nulis implementasine pola iterator: WordIterator, overriding 2 metode: hasNext()lan 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--;
        }
    }
}
Kabeh sing isih ana yaiku nemtokake iterator menyang kelas Word:
public class Word implements Iterable<Word.WordPart> {@Override
	public Iterator<WordPart>iterator() {
    		return new WordIterator(this);
	}}
Saiki ayo nindakake analisis morfem saka tembung "rush":
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());
        }
    }
}
Elinga yen ing implementasine pola iterator, aku milih urutan output ing ngisor iki:
  1. pungkasan
  2. sufiks
  3. konsol
  4. oyod
Nalika ngrancang iterator dhewe, sampeyan bisa nemtokake algoritma pengulangan sing dikarepake. Good luck ing pasinaon!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION