JavaRush /Java Blog /Random-TK /Iterator nagşy

Iterator nagşy

Toparda çap edildi
Bu gün Iterator-yň Java-daky nämedigini we näme üçin zerurdygyny gürleşeris .
Iterator nagşy - 1
Mälim bolşy ýaly, Java-da Iterator interfeýsini ýerine ýetirýän ajaýyp Kolleksiýa interfeýsi bar. Derrew öňünden bellik goýaýyn: iterator interfeýsini Java-da iterator nagşy bilen garyşdyrmaly däl! Düşündirmek üçin ilki interfeýsine seredeliň.
Göçme manyda “Iterator” “zalym güýç ” hökmünde terjime edilip bilner . .Agny, ýygyndydaky ähli elementleriň üsti bilen gaýtalap bilýän belli bir guramadyr. Mundan başga-da, kolleksiýalaryň içerki gurluşyna we tertibine göz aýlamazdan muny etmäge mümkinçilik berýär.
Java-da iteratoryň ýokdugyny bir sekunt göz öňüne getireliň. Bu ýagdaýda, her kim kolleksiýalaryň çuňlugyna çümmeli we nämäniň we nämäniň tapawudyna ArrayListhakykatdanam LinkedListdüşünmeli HashSetbolar TreeSet.

Iteratoryň durmuşa geçirmeli usullary

boolean hasNext()- gaýtalanyp boljak obýektde (häzirki ýygyndy) henizem bahalar galan bolsa, truebaşga gymmatlyklar ýok bolsa, usul gaýdyp geler false. E next()- ýygyndy (obýekt) indiki elementini gaýtaryp berýär. Başga elementler ýok bolsa (barlag ýokdy we kolleksiýanyň soňuna ýetenimizde hasNext()jaň etdik ), usul atar . - iň soňky alan elementini aýyrar . Usul zyňyp biler: next()NoSuchElementExceptionvoid remove()next()
  • UnsupportedOperationException, bu iterator usuly goldamaýan bolsa remove()(mysal üçin diňe okalýan ýygyndylarda)
  • IllegalStateException, usul next()entek çagyrylmadyk bolsa ýa-da remove()soňky jaňdan bäri eýýäm çagyrylan bolsa next().
Şeýlelik bilen, sanaw üçin iterator iň köp ýaýran ýerine ýetirişdir. Iterator kolleksiýanyň başyndan ahyryna çenli gidýär: indiki elementiň bardygyny ýa-da ýokdugyny görüp, bar bolsa yzyna gaýtaryp berýär. Bir sikl bu ýönekeý algoritmiň esasynda gurulýar for-each. Giňeldilmegi “ListIterator”. Geliň, java sanawynyň iterator usullaryna seredeliň. Olary bilýän bolsaňyz gerek:
  • void add(E e)- bir element Esalýar ;List
  • boolean hasPrevious()- ters gözleg wagtynda elementler bar truebolsa gaýdyp geler ;List
  • int nextIndex()- indiki elementiň indeksini yzyna getirer;
  • E previous()- öňki sahypanyň elementini yzyna berer;
  • int previousIndex()- öňki elementiň indeksini yzyna getirer;
  • void set(E e)next()- soňky jaň bilen yzyna gaýtarylan elementi ýa- previous()da elementi çalşar e.
Geliň, kiçijik bir meselä seredeliň. Geliň, Listokuwçylara salam setirlerini öz içine alýan:
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Обучающимся");
list.add("На");
list.add("JavaRush");
Indi munuň üçin iterator alarys we ähli setirleri konsola çap ederis:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
Indi “päsgelçilik” bolar: Java kolleksiýalary, bilşiňiz ýaly (we bilmeseňiz, anyklaň) interfeýsi giňeldiň , Iterableýöne bu diňe many aňlatmaýar we iteratory goldaýar. Sebäbi hem goldanýar, ýöne çagyrylmaly : ListSetQueuejava Map iteratorMap.entrySet()
Map<String, Integer> map = new HashMap<>();
Iterator mapIterator = map.entrySet().iterator();
Soňra usul “açar” - “baha” jübütini öz içine alýan next() obýekti yzyna getirer . EntrySoňra hemme zat birmeňzeş List:
while (mapIterator.hasNext()) {
    Map.Entry<String, Integer> entry = mapIterator.next();
    System.out.println("Key: " + entry.getKey());
    System.out.println("Value: " + entry.getValue());
}
Siz: “Dur. Interfeýs hakda aýdýarys, makalanyň ady “Nusga” diýilýär. ? Agny, iterator nagşy Iterator interfeýsi? Ora-da interfeýs nagyşmy? Bu söz ilkinji gezek peýda bolsa, size salgylanma berýärin: nagyş dizaýn nagşy, bir synpyň ýa-da köp baglanyşykly synplaryň berjaý etmeli belli bir häsiýetidir. Java-da iterator, içerki gurluşy gaýtalanmagy öz içine alýan islendik obýekt üçin amala aşyrylyp bilner we ara alnyp maslahatlaşylan usullaryň goly üýtgedilip bilner. Bir nagyş durmuşa geçirilende esasy zat, synpyň berjaý etmeli logikasydyr. Iterator interfeýsi,List, Set, Queue, Map programmistiň islegine görä , taýýar gurluşlara () we beýlekilere ulanylýan, şol bir atyň nagşynyň şahsy durmuşa geçirilmegi . Iterator interfeýsini giňeltmek bilen, bir nagşy durmuşa geçirýärsiňiz, ýöne nagşy durmuşa geçirmek üçin interfeýsi giňeltmegiň zerurlygy ýok. Simpleönekeý meňzeşlik: balyklaryň hemmesi ýüzýär, ýöne ýüzýänleriň hemmesi balyk däl. Mysal hökmünde, söz almagy makul bildim. Has takygy, at. Böleklerden durýar: prefiks, kök, goşulma we gutarmak. WordPartSözüň bölekleri üçin interfeýs we ony uzaldýan synplar dörederis 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;
    }
}
Soňra synpda Word(söz) bölekler bolar we olara goşmaça sözdäki bölekleriň sanyny görkezýän bitewi san goşarys:
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;
    }
Bolýar, bizde dört sany artykmaç konstruktor bar (ýönekeýlik üçin, diňe bir goşulma bolup bileris öýdýän). Isim bir prefiksden ybarat bolup bilmez, şonuň üçin bir parametrli konstruktor üçin kök gurarys. Indi iterator nagşynyň ýerine ýetirilişini ýazalyň: WordIterator, 2 usuly ýok edip: hasNext()we 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--;
        }
    }
}
Galan zat, iteratory synpa bellemek Word:
public class Word implements Iterable<Word.WordPart> {@Override
	public Iterator<WordPart>iterator() {
    		return new WordIterator(this);
	}}
Indi “howlukma” sözüniň morfemiki derňewini geçireliň:
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());
        }
    }
}
Iterator nagşyny ýerine ýetirenimde, aşakdaky çykyş tertibini saýlandygymy ýadyňyzdan çykarmaň:
  1. gutarýar
  2. goşulmasy
  3. konsol
  4. kök
Öz iteratoryňyzy düzeniňizde, isleýşiňiz ýaly gaýtalama algoritmini kesgitläp bilersiňiz. Okuwyňyzda üstünlik arzuw ediň!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION