DefClass Point2D

Status
Nicht offen für weitere Antworten.

alge

Mitglied
Hallo.

Hier wieder eine Frage von mir :lol:

Es ging um folgende Aufgabe:

"Schreiben Sie eine Klasse Point2D, die einen zwei-dimensionalen Punkt repräsentiert.
Schreiben Sie danach eine main-Methode, die vom Benutzer mehrerer Punkte verlangt.
Diese Punkte sollen in einem Vector gespeichert werden. Der Benutzer soll die Eingabe
der Punkte durch eine Abbruchbedingung beenden können. Das Programm soll anschließend
die Länge der Strecke, die durch die eingegebenen Punkte definiert ist, auswerten
und ausgeben."

Der Code ist noch nicht fertig, meine Frage bezieht sich aber eigentlich nur auf einen Teil des Codes:

Wenn ich wie in Zeile 74-82 Point2D-Objekte aus der Kollektionsklasse rausholen und zuweisen will, damit ich sie nachher den selbstdefinierten Methoden unterwerfen kann: wie mache ich das? So gehts auf jeden Fall nicht, "incompatible Types".

Nachtrag: Jetzt funktionierts.

Code:
import java.io.*;
import java.util.*;

class Point2D {
	
	private double x;
	private double y;
	public List l;
		
		public Point2D() {
			this.l = new Vector();
	}
	
	public Point2D(double x, double y) {
		this.x = x;
		this.y = y;
	}
			
	public Point2D readpoint() throws IOException {
		System.out.println("Bitte geben sie einen Punkt (x,y) ein");
		System.out.println("");
		System.out.flush();
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();
		String s1 = s.substring(0,1);
		Double dx = Double.valueOf(s1);
		double x = dx.doubleValue();
		String s2 = s.substring(2,3);
		Double dy = Double.valueOf(s2);
		double y = dy.doubleValue();
		Point2D point = new Point2D(x,y);
		l.add(point);
		return point;
		}
		
		
	public Point2D vdif(Point2D p) {
		double x = Math.abs(this.x - p.x);
		double y = Math.abs(this.y - p.y);
		Point2D dif = new Point2D(x,y);
		return dif;
	}
	
	public double vlength() {
		double vl = Math.sqrt(((this.x)*(this.x))+((this.y)*(this.y)));
		return vl;
	}
	
		
}

class anwendung {
	public static void main(String args[]) throws IOException {
		Point2D a = new Point2D();
		String e = ("ENDE");
		Point2D m = null;
		Point2D k = null;
		boolean weiter = true;
		while (weiter) {
		a.readpoint();
		System.out.println("Sobald Sie fertig sind, geben Sie bitte 'ENDE' ein. Ansonsten drücken Sie Enter.");
		System.out.flush();
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();
		if (s.equals(e)) {
		
			weiter = false;
		}
		}
		
		Iterator it = (a.l).iterator();
		double gesst = 0;
		double st = 0;
		Point2D d = null;
		int count = 0;
		while (it.hasNext()) {
			if (count == 0) {
			m = (Point2D) it.next();
			}
				if (it.hasNext()) {
					k = (Point2D) it.next();
					d = m.vdif(k);
					st = d.vlength();
					gesst = gesst + st;
					m = k;
				}
				count++;
		}
		System.out.println(gesst);				
		}
}

Danke :applaus:
 

André Uhres

Top Contributor
Code:
       //Den Iterator erst holen, nachdem die Liste gefüllt wurde:
        Iterator it = a.l.iterator();
        while (it.hasNext()) {
            while (it.hasNext() & count < 2) {
                switch (count) {
                    case 0: k = (Point2D) it.next();
                    case 1: m = (Point2D) it.next();
                }
                count++;
            }
            Point2D d = m.vdif(k);
            double st = d.vlength();
        }
Oder so (JDK 1.5):
Code:
       Iterator<Point2D> it = a.l.iterator();
        while (it.hasNext()) {
            while (it.hasNext() & count < 2) {
                switch (count) {
                    case 0: k = it.next();
                    case 1: m = it.next();
                }
                count++;
            }
            Point2D d = m.vdif(k);
            double st = d.vlength();
        }
 
B

Beni

Gast
Hm, die "breaks" nicht vergessen:
Code:
switch( ... ){
  case 0: ...
    break;

  case 1: ...
    break;
}

Sonst wird zuviel aufgerufen.
 

alge

Mitglied
Aha, dankeschön.

Allerdings: wenn ich den Code entsprechend ändere, heisst es "variable m,k might not have been initialized". Dabei hab ichs doch korrekt initialisiert? Stimmt bei der Zuweisung was nicht?
 
P

penizillin

Gast
bei der deklaration direkt etwas zuweisen:
Code:
Point2D m = null;
// oder 
Point2D m = new Point2D.Float();
 

alge

Mitglied
Okay, das hab ich jetzt, so lässt sich das Programm auch kompilieren. Allerdings gibt es jetzt bei der Methode readpoint() jedesmal eine Exception, unabhängig von der Eingabe. Die Methode muss ja die Exception werfen, oder kann ich das irgendwie vermeiden?
 
P

penizillin

Gast
...und was steht momentan in dieser zeile? und drum herum, insb. davor?
 

alge

Mitglied
Code:
public Point2D readpoint() throws IOException {
      System.out.println("Bitte geben sie einen Punkt (x,y) ein");
      System.out.println("");
      System.out.flush();
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      String s = br.readLine();
      String s1 = s.substring(0,1);
      Double dx = Double.valueOf(s1);
      double x = dx.doubleValue();
      String s2 = s.substring(2,3);
      Double dy = Double.valueOf(s2);
      double y = dy.doubleValue();
      Point2D point = new Point2D(x,y);
      // hier soll die Exception liegen:
      l.add(point);                                     
      return point;
      }

Code:
class anwendung {
   public static void main(String args[]) throws IOException {
      Point2D a = new Point2D();
      boolean weiter = true;
      Point2D m = null;
      Point2D k = null;
      while (weiter) {
      // und das soll die zweite Exception sein:
      a.readpoint();
      System.out.println("Sobald Sie fertig sind, geben Sie bitte ein Zeichen ein. Ansonsten drücken Sie Enter.");
      System.out.flush();
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      String s = br.readLine();
      if (s != null) {
         weiter = false;
      }
      }
 
P

penizillin

Gast
...und WAS davon ist zeile 33?
was ist zeile 60?

bin ich hellseher?
 
P

penizillin

Gast
in einem konstruktor wird die liste "l" nicht inistialisiert.
wird dieser aufgerufen?
 

alge

Mitglied
penizillin hat gesagt.:
in einem konstruktor wird die liste "l" nicht inistialisiert.
wird dieser aufgerufen?

Sorry hatte Durcheinander.

Der Konstruktor, in dem die Liste l initialisiert ist, wird ja in der Anwendung aufgerufen. Reicht das nicht aus?
 
P

penizillin

Gast
der konstruktor initialisiert den vektor "l" nicht, sondern legt nur ein lokales objekt an. richtig ist:
Code:
public Point2D() { 
         this.l = new Vector(); 
}
 

alge

Mitglied
okay, danke. die nächste Exception liegt in der Methode vdif:

Code:
public Point2D vdif(Point2D p) {
      double x = Math.abs(this.x - p.x);
      double y = Math.abs(this.y - p.y);
      Point2D dif = new Point2D(x,y);
      return dif;
   }

Müsste man da die Instanzvariablen anders aufrufen?
 

alge

Mitglied
Code:
public Point2D vdif(Point2D p) {
      double x = Math.abs(this.x - p.x);
      double y = Math.abs(this.y - p.y);
      Point2D dif = new Point2D(x,y);
      return dif;
   }

Exception in thread "main" java.lang.NullPointerException
und zwar in Zeile 2 des Ausschnitts.
 
P

penizillin

Gast
dann ist p wohl null.
und jetzt schau ich mir deine main methode an und frage mich, was du da machst.

die geschachtelte while schleife überspringt immer ein element im iterator. im switch fehlt noch der fall "default", der evtl. eintreten könnte.

was ist "weiter"?
 

alge

Mitglied
penizillin hat gesagt.:
dann ist p wohl null.
und jetzt schau ich mir deine main methode an und frage mich, was du da machst.

die geschachtelte while schleife überspringt immer ein element im iterator. im switch fehlt noch der fall "default", der evtl. eintreten könnte.

was ist "weiter"?

Die Exception tritt auf, bevor ein zweites Objekt eingegeben werden konnte, also ist p null. Wars das Huhn oder das Ei?

Boolean "weiter" ist der Versuch einer Abbruchbedingung.

Aber du hast Recht, die while schleife mit dem iterator muss man anders aufbauen.
 

alge

Mitglied
Neuer Versuch der While Schleife:

Code:
Iterator it = (a.l).iterator();
		double gesst = 0;
		double st = 0;
		Point2D d = null;
		int count = 0;
		while (it.hasNext()) {
			if (count == 0) {
			m = (Point2D) it.next();
			}
				while (it.hasNext()) {
					k = (Point2D) it.next();
					d = m.vdif(k);
					st = d.vlength();
					gesst = gesst + st;
					m = k;
					count++;
				}
		}
 

alge

Mitglied
Mit der neuen While-Schleife und ein paar Modifikationen funktioniert jetzt alles richtig. s. Code im ersten Post.
Danke! :cool:
 

alge

Mitglied
Noch eine Frage, die damit zu tun hat:

Die Vorlesung nach der ich lerne arbeitet mit Enumerations und der Vector-Klasse, da ich vielfach gehört habe, diese seien veraltet und ineffizient, arbeite ich stattdessen mit Lists und Iterator. Möchte ich ein Objekt aus einer Liste holen, daß an einer bestimmten Stelle steht, gibt es dafür in der Vector-Klasse ja die Methode elementAt(). Entspricht dem bei Lists die Methode get() ?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben