Wyciąganie elementu klasy z iteratora.

Wyciąganie elementu klasy z iteratora.
IS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

Witam, mam pewien problem
Mam taką klasę:

Kopiuj
public class Point
{
double x;
double y;

public Point(Double X, Double Y) 
	{
		x = X;
		y = Y;
	}
}

w programie robię listę, a potem dodaję do niej jakieś elementy typu Point:

Kopiuj
ArrayList<Point> arrayList = new ArrayList<Point>();

Tworzę listę z wynikami, iterator do pierwszej listy oraz pomocnicze obiekty typu Point

Kopiuj
ArrayList<Point> arrayListScore = new ArrayList<Point>();
Iterator<Point> i = arrayList.iterator();
Point point = new Point(0.0, 0.0);
Point pointNastepny = new Point(0.0, 0.0);
Point pointDoZapisu = new Point(0.0, 0.0);

Poruszam się po liście arrayList pętlą while, niby kompilator akceptuje to ale wyświetla mi błąd w programie gdy już coś dodam:

Błąd: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.ArrayList$Itr cannot be cast to Point

Kopiuj
while(i.hasNext())
{
	point = (Point) i;
	pointNastepny = (Point) i.next();
	
	if(point.x > 0 && pointNastepny.y>0)
	{
		pointDoZapisu.x = point.x;
		pointDoZapisu.y = pointNastepny.y;
	}
}

Nie wiem co robię źle w tej pętli while, mógłby mnie ktoś nakierować? Jakie tak naprawdę informacje niesie ze sobą iterator, bo chyba źle go zrozumiałem.
Jeszcze chciałbym się zapytać jak w pętli while zacząć od konkretnego iteratora.

atmal
  • Rejestracja:około 8 lat
  • Ostatnio:19 dni
  • Postów:913
0
Kopiuj
point = (Point) i;

i to iterator więc nie możesz go rzutować na Point. Aby pobrać obiekt musisz użyć:

Kopiuj
point = i.next();

Failure of one test is a tragedy, failure of fifty is a statistic.
edytowany 1x, ostatnio: atmal
IS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

A to

Kopiuj
point = i.next();

Nie zwraca kolejnego kolejnego obiektu? Tak jakby w uproszczeniu obiektu i+1?

A jak mam zrobić, żeby pobrać obiekt na który jest iterator i kolejny iterator tak jak napisałem wyżej?

atmal
  • Rejestracja:około 8 lat
  • Ostatnio:19 dni
  • Postów:913
1

next() to w pewnym sensie obecny obiekt, czyli i, aby pobrać kolejny wystarczy wywołać to jeszcze raz.

Kopiuj
Point point = i.next();
Point next = i .next();

Failure of one test is a tragedy, failure of fifty is a statistic.
IS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

Tego to nie wiedziałem, dzięki.

A jeszcze chciałem się zapytać czy da się zacząć pętle while od konkretnego iteratora?

atmal
  • Rejestracja:około 8 lat
  • Ostatnio:19 dni
  • Postów:913
2

A nie możesz zastąpić tego pętlą for?

Kopiuj
Point pointToSave;
for(int i = 0; i < points.size() - 1; i++)
{
    Point point = points.get(i);
    Point next = points.get(i + 1);

    if(point.x > 0 && next.y > 0)
    {
        pointToSave = new Point(point.x, next.y);
    }
}

W tej pętli inkrementacja jest o jeden, co oznacza że w drugiej iteracji pętli point będzie tym samym co next z poprzedniej iteracji.


Failure of one test is a tragedy, failure of fifty is a statistic.
edytowany 3x, ostatnio: atmal
P7
Ta pętla wychodzi poza zakres dla i+1 w ostatniej iteracji
atmal
Tak, pisałem już z autorem na ten temat ale zapomniałem tutaj zaktualizować. Dzięki za czujność.
IS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

No rzeczywiście mogę i to rozwiązanie chyba nawet lepsze będzie.
Jeszcze raz wielkie dzięki :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.