dlaczego w interfejsie iteratora nie ma metody add

W Iterator Sun dodał metodę remove, aby usunąć ostatni dostępny element kolekcji. Dlaczego nie ma metody add, aby dodać nowy element do kolekcji? Jakie skutki uboczne może mieć kolekcja lub iterator?

Author: fastcodejava, 2012-06-25

6 answers

Jedynym celem iteratora jest wyliczenie poprzez zbiór. Wszystkie zbiory zawierają metodę add(), która służy twojemu celowi. Nie byłoby sensu dodawanie do iteratora, ponieważ zbiór może być uporządkowany lub nie (w przypadku HashSet).

EDIT: pracując nad innym problemem, wymyśliłem inny powód, dla którego Iterator nie ma metody add(). Patrząc pod maskę ArrayList (linia 111), oraz HashMap (linia 149), widzimy, że implementacja to tylko kilka metod otaczających tablicę obiektów. Teraz rozważamy, jak tablice są traktowane w pamięci.

indeksy tablicowe oparte na Odrach

Jest to Tablica 5 elementów. Istnieje jednak sześć wskaźników. Litera " a " w tej tablicy jest wymieniona jako element 0, ponieważ aby ją odczytać, od lewej do prawej, tak jak robi to komputer, musisz zacząć od indeksu 0. Teraz, jeśli będziemy iterować przez tę tablicę (tak, kolekcja, ale sprowadza się to do tablicy), zaczniemy od indeksu 0 i będziemy kontynuować do indeksu 1. W tym momencie w Iteratorze chcemy wywołać add("f");. W tym miejscu porównajmy implikacje add() i remove(). remove() zostawiłoby spację w tablicy, którą łatwo przeskoczyć, ponieważ możemy natychmiast rozpoznać, że nie jest ona członkiem. Z drugiej strony add() umieściłoby nowy element, którego wcześniej nie było. Będzie to miało wpływ na długość tablicy, którą iterujemy. Co się stanie, gdy dotrzemy do ostatniego elementu? Czy możemy nawet zagwarantować, że tam jest (to znaczy, że tablica nie przekroczyła maksymalnego rozmiaru)?

Podsumowując, argumenty tak czy inaczej mają ważne punkty, ale najważniejsze jest to, że zachowanie metody add() nie jest dobrze zdefiniowane we wszystkich przypadkach. Sun musiał dokonać wyboru, gdzie ograniczyć funkcjonalność, i zdecydowali się nie włączać tej metody.

 10
Author: gobernador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Dobra, zaczynamy:

Odpowiedź jest wyraźnie podana w FAQ projektu:

Dlaczego nie podasz iteratora?metoda dodawania?

Semantyka jest niejasna, biorąc pod uwagę, że umowa na Iterator nie gwarantuje kolejności iteracji. Należy jednak pamiętać, że ListIterator zapewnia operację add, ponieważ gwarantuje kolejność iteracji.

Http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10

 13
Author: jontro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-25 20:42:20

Jeśli pracujesz nad listą, możesz użyć ListIterator, który zapewnia zarówno operacje dodawania, jak i usuwania.

 5
Author: jontro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-25 20:15:50

Iterator ma tylko wskaźnik do następnego elementu. gdzie jako Listysterator mają również wskaźniki do poprzedniego elementu (pamiętaj, że może przemieścić się do tyłu).

 1
Author: Vincent Lal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-07 11:24:52

Ponieważ ListIterator utrzymuje kolejność wstawiania, dzięki czemu można dostać się do punktu, w którym chcesz dodać. Iterator nie dba o porządek i co z tego, że dodaje obiekt do poprzednich wartości podczas iteracji, to byłoby katastrofą. Z tego powodu iterator otrzymuje tylko metodę remove (), ponieważ masz określony obiekt i miejsce, z którego chcesz go usunąć.

 1
Author: dev work,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-19 22:42:41

Nie mogę wymyślić żadnego teoretycznego powodu, dla którego add() nie mógł zostać włączony do Iterator. Podobnie jak Iterator może pozwolić na usunięcie elementów z kolekcji przez siebie, może być zaprojektowany do obsługi elementów dodawanych w ten sam sposób.

Ale powiem, że przez wszystkie moje lata programowania w Javie-ponad 15! -- Nigdy nie chciałem metody Iterator.add(). Więc podejrzewam, że to po prostu nie jest aż tak przydatne.

 0
Author: Ernest Friedman-Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-25 20:12:54