Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Usuwanie elementu za pomocą iteratora

Dostałem zadanie utworzenia kontenera HashSet i za pomocą iteratora (nie list iteratora) usunięcie przedostatniego elementu. Wszystkie moje starania zakończyły się fiaskiem. Poniżej kod (błędny niestety). Co zmienić, aby kod działał prawidłowo?


import java.util.*;

public class JavaApplication
{
public static void main(String[] args)
{
int i=0, licznik=-1;
HashSet<String> lista =new HashSet<String>();
lista.add("jeden");
lista.add("dwa");
lista.add("trzy");
lista.add("cztery");
lista.add("piec");
lista.add("szesc");
lista.add("piec");
lista.add("piec");

Iterator <String>it=lista.iterator();
Iterator <String>it2=lista.iterator();
Iterator <String>it3=lista.iterator();

while(it.hasNext()) //wyświetla liste i zlicza elementy
{
licznik++;
System.out.println(it.next());
}
System.out.println("\n");

while(it2.hasNext()) //usuwa przedostatni element
{
i++;
it2.next();
if(i==licznik)
it2.remove();
}
System.out.println("\n");

while(it3.hasNext()) //wyswietla liste po usunieciu
{
System.out.println(it3.next());
}
}
}
Kamil Mikołajczyk

Kamil Mikołajczyk programista Java /
Grails

Temat: Usuwanie elementu za pomocą iteratora

Jeśli problemem jest ConsurrentModificationException, to wystarczy przenieść definicję it3 tuż przed ostatnią pętlą while, tzn. tak, żeby it3 było utworzone po usunięciu elementu.

Ale tak ogólnie to zadanie jest lekko bez sensu, bo Set to zbiór i elementy w nim nie mają określonej kolejności, a więc nie można mówić o "przedostatnim" elemencie, bo kolejność dodawania do Setu jest losowa.Kamil Mikołajczyk edytował(a) ten post dnia 25.03.12 o godzinie 22:47

konto usunięte

Temat: Usuwanie elementu za pomocą iteratora

Na pewno nie losowa :-P

Jesli uzyjesz LinkedHashSet zamiast HashSet, to wtedy to zadanie nabiera nieco sensu.Wlodzimierz M. edytował(a) ten post dnia 25.03.12 o godzinie 22:57

konto usunięte

Temat: Usuwanie elementu za pomocą iteratora

Być może zadanie było mądrzejsze niż się Wam wydaje. Może po prostu miało przetestować umiejętność czytania dokumentacji, np. Java Doc ?

Z dokumentacji do HashSet: "It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.".

Cóż - jeśli nie znamy klasy, najpierw czytamy, a później używamy. Inaczej widzi się później w kodzie takie "cuda", że ho ho ;))
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Usuwanie elementu za pomocą iteratora

Przeniesienie definicji zadziałało. Dziękuję bardzo za pomoc.:)
Maciej Nowicki

Maciej Nowicki Java Developer

Temat: Usuwanie elementu za pomocą iteratora

Weź do serca to co napisali przedmówcy - zdanie usunięcia przedostatniego elementu z kolekcji z definicji nieuporządkowanej jest bez sensu - i czy aby nie o to chodziło, abyś od razu powiedział "to zadanie jest bez sensu".

Zdarzyło mi się o podobne rzeczy pytać podczas rozmowy i takiej właśnie odpowiedzi wtedy bym oczekiwał
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Usuwanie elementu za pomocą iteratora

Dziękuję za informację. :)

Treść zadania brzmiała: " podany ciąg znaków [jeden dwa trzy cztery pięć sześć pięć pięć] umieść w kontenerze HashSet. Za pomocą Iteratora usuń przedostatni element".

Z tego co wyczytałem o kontenerze HashSet to wypisuje on elementy bez powtórzeń w sposób "losowy" (a raczej bez gwarancji zachowania poprawnej kolejności). Z jednej strony faktycznie usuwanie przedostatniego elementu jest dość bezsensowne, z drugiej strony jednak przedostatni element jest najtrudniejszy do usunięcia (wg mnie przynajmniej). Z informacji do których się dokopałem iterator przemieszcza się tylko w jedną stronę. Iterator należy najpierw ustawić na odpowiedni element. Ustawienie na zadany element bądź ostatni można zrobić za jednym obiegiem pętli (wstawienie licznika w przypadku dowolnego elementu, bądź gdy polecenie hasNext() zwróci fałsz w przypadku ostatniego). W przypadku przedostatniego trzeba się trochę bardziej napracować i zapewne o to chodziło.

Dziękuję za informację. :)

konto usunięte

Temat: Usuwanie elementu za pomocą iteratora

.Ten post został edytowany przez Autora dnia 10.08.16 o godzinie 23:05
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Usuwanie elementu za pomocą iteratora

Paweł Włodarski:
Dopytaj się prowadzącego o co tutaj naprawdę chodzi.

To biędzie najlepsze wyjście z sytuacji :)
Paweł Włodarski:
Ps. i Błagam, nigdy nie nazywaj zmiennych typu Set - "lista" :D

Wezmę sobie to do serca :)



Wyślij zaproszenie do