Dina iki kita bakal ngomong babagan apa Iterator ing Jawa lan apa sing dibutuhake.
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.
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
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. |
ArrayList
saka LinkedList
lan HashSet
saka 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 kasebutremove()
(umpamane koleksi mung diwaca, contone)IllegalStateException
, yen caranext()
durung disebut, utawa yenremove()
wis disebut wiwit telpon pungkasannext()
.
for-each
. Ekstensi kasebut yaiku ListIterator. Ayo goleki metode iterator dhaptar java tambahan. Sampeyan bisa uga ngerti dheweke:
void add(E e)
- nglebokake unsurE
menyang ;List
boolean hasPrevious()
- bakal balitrue
yenList
ana 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 pungkasannext()
utawaprevious()
karo unsure
.
List
ukara 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
, Set
lan Queue
ndhukung iterator. Kanggo java Map iterator
uga didhukung, nanging kudu diarani Map.entrySet()
:
Map<String, Integer> map = new HashMap<>();
Iterator mapIterator = map.entrySet().iterator();
Banjur cara next()
bakal ngasilake obyek Entry
sing 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 WordPart
lan 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:
- pungkasan
- sufiks
- konsol
- oyod
GO TO FULL VERSION