Klasse Mit Collections

sh33p

Bekanntes Mitglied
Java:
import java.util.*;
public class FigurenListe {

LinkedList figurenListe = new LinkedList();



public void figurAnfuegen(double breite,double laenge){

// add aus LinkedList überschreiben
Rechtecke r = new Rechtecke(breite,laenge);


figurenListe.add(r);


}
public void anzeigen(){
  for (Iterator iter = figurenListe.iterator(); iter.hasNext();) {
    System.out.println(iter.next());
  }
}


}

Habe folgende Klasse geschrieben.Die methode figurAnfuegen fuegt ein Rechteck ein,das in einer anderen Klasse definiert ist. jetzt möchte ich die Liste,wo die Figurenobjekte eingefuegt werden, ausgeben.klappt nur nich so ganz :rtfm:
 
Was genau funktioniert nicht?
Bekommst du gar keine Ausgabe? Eine Ausgabe die du nicht erwartest?
Mit "klappt nur nicht so ganz" lässt sich nicht wirklich etwas anfangen.
 
du brauchst keinen iterator dazu, es reicht eine for schleife...so bekommst du aber nur das Rechteckobjekt, keine ahnung wie deine methoden zum ausgeben der attribute heißen...vllt r.getBreite();??
Java:
for(int i=0;i<figurenListe.size();i++){
System.out.println(figurenListe.get(i).getBreite());
}
 
Was passiert denn?

Probiers mal so:
Java:
Iterator itr = figurenListe.iterator();

	        while(itr.hasNext()){
	            Rechtecke element = itr.next();
	            System.out.println(element.toString());	            
	        }

Bin mir aber jetzt nicht sicher ob das funzt
 
Ohne Generics sind in deiner LinkedList auch nur Objects drin. Ein Object hat keine deiner genannten Methoden.
Die .toString() Methode zu überschreiben sollte bereits helfen. Alternativ die Liste mit Generics anlegen oder (eher schlecht als recht) die Objekte zu einem Rechteck casten.
Mit einer for über den Index zu gehen (wie von jemand anderen Vorgeschlgen) würde ich bei einer LinkedListe jetzt aber nicht.
 
LinkedList<Rechtecke> figurenListe = new LinkedList<Rechtecke>();

kann ich nun auch z.b Kreise aufnehmen also?

LinkedList<Rechtecke,Kreise> figurenListe = new LinkedList<Rechtecke,Kreise>();?
 
LinkedList<Rechtecke> figurenListe = new LinkedList<Rechtecke>();

kann ich nun auch z.b Kreise aufnehmen also?
Deine LinkedList (besser gegen das Interface List implementieren) kann jetzt alle Rechtecke und alle Klassen die von Rechteck erben aufnehmen. Aber da ich mal davon ausgehe dass Kreis nicht von Rechteck erbt (hm, oder vllt ist nen Kreis einfach nur nen Rechteck mit unendlich vielen Kante? :rtfm:...) kannst du nur Rechtecke in die Liste aufnehmen.
Wenn du eine gemeinsame Oberklasse, z.b. GeometrischeForm, hättest könntest du schreiben:
Java:
List<GeometrischeForm> liste = new LinkedList<GeometrischeForm>();
Dann kannst du in die Liste Rechtecke, Kreise, Dreiecke etc. legen.
 
also ich haben jetzt folgende Klassen:

Java:
public class GeometrischeFormen {

  public void anzeigen(){

  }
}

public class Kreise extends GeometrischeFormen {

  private double radius;
  private double durchmesser;
  private double umfang ;
  private double flaeche;
  
  
  public Kreise(double radius){
    this.radius = radius;
    durchmesser = 2* radius;
    umfang = 3.14 * (2*radius);
    flaeche = 3.14 * (radius*radius);
  }
  public double getDurchMesser(){
    return durchmesser;
  }
  public double getUmfang(){
    return umfang;
  }
  public double getFlaeche(){
    return flaeche;
  }
  public double getRadius(){
    return radius;
  }
  public void anzeigen(){
    System.out.println("Radius : " + getRadius() + " Umfang: " + getUmfang() + " DurchMesser " + getDurchMesser() + " Flaeche: " + getFlaeche());
  }
}


public class Rechtecke extends GeometrischeFormen {

double breite;
double laenge;
double flaeche;
double umfang;


public Rechtecke(double breite, double laenge){
  this.breite = breite;
  this.laenge = laenge;
  umfang = 2*breite + 2*laenge;
  flaeche = breite * laenge;
}
public double getBreite(){
  return breite;
}
public double getLaenge(){
  return laenge;
}
public double getFlaeche(){
  return flaeche;
}
public double getUmfang(){
  return umfang;
}
public void anzeigen(){
  System.out.println("Breite : " + getBreite() + " Laenge: " + getLaenge() + " Flaeche " + getFlaeche() + " Umfang " + getUmfang());
}


}
import java.util.*;
public class FigurenListe {

LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();



public void figurAnfuegen(GeometrischeFormen r){

figurenListe.add(r);


}
public void anzeigen(){
  for(int i=0;i<figurenListe.size();i++){
System.out.println("Breite: " +figurenListe.get(i).....


}
}




}

1.Was kann ich denn z.b in Geometrische Formen deklarieren,damit sich eine Sinnvolle Vererbung ergibt?
2. Kann ich eine Methode schreiben, die egal von welchem Typ ein neues Objekt anlegt? D.h ein und dieselbe Methode, die einen Kreis anlegt, die ein Rechteck anlegt usw..? Oder muss ich seperate Methoden deklarieren? (Methode figurAnfuegen)
 
1.Was kann ich denn z.b in Geometrische Formen deklarieren,damit sich eine Sinnvolle Vererbung ergibt?
Zunächst mal würd ich die Klasse als abstract class deklarieren.
Dort kannst du dann alles implementieren was die Objekte gemeinsam haben. Z.b. Umfang und Flaeche (wobei man da überlegen könnte die Werte nicht übergeben zu lassen sondern jedesmal zu berechnen, dann würde die Berechnung allerdings wieder in die Unterklassen fliegen).

2. Kann ich eine Methode schreiben, die egal von welchem Typ ein neues Objekt anlegt? D.h ein und dieselbe Methode, die einen Kreis anlegt, die ein Rechteck anlegt usw..? Oder muss ich seperate Methoden deklarieren? (Methode figurAnfuegen)
Das könntest du erreichen indem du z.b. die Oberklasse zu nem Interface machst und dort ne Methode createNew() definierst, alle Unterklassen müssen die Methode implementieren und geben dann ein neues Objekt von sich zurück.
Oder die Oberklasse so lässt, dort die Methode createNew definierst und z.b. ne UnsupportedMethod exception wirfst wenn die Methode nicht überschrieben wurde.
 
habe jetzt die interface variante gewaehlt

Java:
public interface GeometrischeFormen {

public void anzeigen();
public GeometrischeFormen createNew();


}

public class Kreise implements GeometrischeFormen {

  private double radius;
  private double durchmesser;
  private double flaeche;
  private double umfang;

  
  
  public Kreise createNew(){
    Kreise k = new Kreise();
    return k;
  }
  public void setRadius(){
    this.radius = radius;
  }
  public void setDurchMesser(){
    this.durchmesser = 2*radius;
  }
..


import java.util.*;
public class FigurenListe {

LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();



public void figurAnfuegen(){


}

}

Jetzt soll aber die Methode figurAnfuegen(); figurObjekte also GeometrischeFormen sozusagen anlegen..ich könnte ja jetzt jeweils ein Kreisobjekt oder ein Rechteckobjekt mit createNew() anlegen..aber wie kann ich das Allgemein machen? Bin so durcheinander 😀.
Ich zeig einfach mal die Aufgabenstellung:

Die Klasse FigurenListe soll ein Attribut figurenListe vom Typ LinkedList
(Paket java.util) enthalten und die Methoden figurAnfuegen,
l. Mit Hilfe der Methode figurAnfuegen soll ein Figurenobjekt am Ende von figurenListe
eingefuegt werden.
 
ich habs jetzt anders gemacht


in Kreise und Rechtecke also eine Methode createNew()

Java:
 public GeometrischeFormen createNew(){
    Kreise k = new Kreise();
    
    return k;
  }

Java:
Kreise+ Rechtecke von Geometrische Formen abgeleitet

public abstract class  GeometrischeFormen {

public abstract void anzeigen();
public abstract GeometrischeFormen createNew();

und in Figurenliste dementsprechend eine methode figurAnfuegen:

Java:
import java.util.*;
public class FigurenListe {

LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();



public void figurAnfuegen(GeometrischeFormen g){

figurenListe.add(g.createNew());
}
public static void main(String[] args) {
    FigurenListe f1 = new FigurenListe();

    
    f1.figurAnfuegen(new Kreise());

    }
}
}

Ich kann jetzt aber das Kreis Objekt irgendwie nicht ansprechen..
 
Also zum einen Würd ich die Methode createNew() static machen, warum wollst du die auf ner Instanz aufrufen?!
Zum anderen brauchst du in deiner FigurenListe noch ne Methode die dir ein Objekt aus der Liste zurückgibt, oder wie wollst du sonst drauf zu greifen? 🙂
 
Java:
 public static GeometrischeFormen createNew(){
    Kreise k = new Kreise();
    
    return k;
  }

und

Java:
import java.util.*;
public class Testbett {

  public static void main(String[] args) {
    FigurenListe f1 = new FigurenListe();

    
    f1.figurAnfuegen(Kreise.createNew());

  }
}

aber wie geb ich ein Objekt der figurenListe zurück?
 
Indem du dir eine getter Methode schreibst, die dir das x-te Element in der FigurenListe zurückgibt.
 
sowas in der Richtung?

Java:
public FigurenListe getFigurenListe(){
      for(int i = 0; i < figurenListe.size();i++){
        return figurenListe.get(i);
      }
    }
???:L
🙁
 
Ja sowas in der Richtung...
Allerdings beendet sich deine Methode direkt im ersten Schleifendurchlauf. Wenn du die ganze liste zurückgeben willst dann gib deine LinkedList zurück. Ich würd mir aber eher so eine Methode schreiben:
Java:
public GeometrischeForm get(int index) {
    /** index prüfen */
    return figurenListe.get(index);
}
 
ok aber wofür brauch ich die Methode?
mein Problem ist ja immer noch ein FigurenObjekt durch die Methode figurAnfuegen(GeometrischeFormen g) zu schreiben..

wenn ich das mache:
z.b

f1.figurAnfuegen(Kreise.createNew());

hab ich zwar mein Objekt der Klasse Kreis,kann damit aber nichts anfangen...
 
ja schon

aber bei z.b


f1.get(1).setFlaeche(100);


wobei setFlaeche eine Methode ist aus Kreise. Die Methode geht benötigt kann aber nur auf GeometrischeFormen zugreifen. (public GeometrischeFormen get.....)
 
Ja, weil du eine Liste von GeometrischeForm'en hast. Java kann ja nicht wissen welche Objekte du wirklich in die Liste legst.
Wenn du auf die Methoden der Unterklassen zugreifen willst musst du auf die entsprechende Klasse casten und vorher am besten per intanceof prüfen ob das auch klappt 😉
 
Du castest nicht auf einen Methodenaufruf, sondern dein Objekt auf ein anderes.

Java:
GeometrischeForm form= new Kreis();
// form.setRadius(); // geht nicht!
Kreis kreis = (Kreis)form;
kreis.setRadius(); // geht!
 
Java:
   f1.figurAnfuegen(new Kreise());
    
    f1.get(1);

wie komm ich jetzt an das Kreisobjekt ran?will ja damit noch irgendwas machen 😀. ich
 
Etwas mitdenken bitte 😉

Java:
f1.figurAnfuegen(new Kreis());
Kreis kreis = (Kreis)f1.get(0);
 
versuch ich ja.nur es fällt mir nicht so leicht wie man sieht.
es tritt eine ClassCastException auf.

wäre es nicht sinnvoller einfach 2 überladene Methoden zu für figurAnfuegen zu schreiben?
Die Aufgabenstellung ist auch einfach mal wieder so unpräzise.:rtfm:
 
Zeig mal den Code bei dem du die Exception bekommst.
Die Exception kann z.b. auftreten wenn du nen Rechteck zu nem Kreis casten willst, das geht halt nicht 😉
 
so werde mal weitermachen.
dasselbe für Rechteck coden.vielen dank schonmal.ich melde mich,wenn ich wieder hilfe brauch 😀
 
so hab die Aufgabe fertig. Folgend zeige ich mal alle Klasse. Bitte Kritik, wenn man irgendwas besser machen könnte usw.

Java:
public abstract class GeometrischeFormen {

double flaeche;
double umfang;



public abstract void anzeigen();


}
public class Rechtecke extends GeometrischeFormen {

private double breite;
private double laenge;



public Rechtecke(double breite, double laenge){
  this.breite = breite;
  this.laenge = laenge;
  this.flaeche = laenge*breite;
  this.umfang = 2*laenge+2*breite;
}
public double getFlaeche(){
  return flaeche;
}
public double getUmfang(){
  return umfang;
}
public double getBreite(){
  return breite;
}
public double getLaenge(){
  return laenge;
}



public void anzeigen(){
  System.out.println("Breite : " + getBreite() + " Laenge: " + getLaenge() + " Flaeche " + getFlaeche() + " Umfang " + getUmfang());
}
public String toString(){
return "Breite : " + getBreite() + " Laenge: " + getLaenge() + " Flaeche " + getFlaeche() + " Umfang " + getUmfang();
}


}
public class Kreise extends GeometrischeFormen {

  private double radius;
  private double durchmesser;

  public Kreise(double radius){
    this.radius = radius;
    this.durchmesser = 2*radius;
    this.flaeche = radius*radius*3.14;
    this.umfang = 2*radius*3.14;
  }
  public double getDurchMesser(){
    return durchmesser;
  }
  public double getUmfang(){
    return umfang;
  }
  public double getFlaeche(){
    return flaeche;
  }

  public double getRadius(){
    return radius;
  }
  public void anzeigen(){
    System.out.println("Radius : " + getRadius() + " Umfang: " + getUmfang() + " DurchMesser " + getDurchMesser() + " Flaeche: " + getFlaeche());
  }
  public String toString(){
    return "Radius : " + getRadius() + " Umfang: " + getUmfang() + " DurchMesser " + getDurchMesser() + " Flaeche: " + getFlaeche();
  }

}
  import java.util.*;
  public class FigurenListe {
  


  LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();



    public void figurAnfuegen(GeometrischeFormen g){

     figurenListe.add(g);
    }
     
    public GeometrischeFormen get(int index) {

    return figurenListe.get(index);
    }
    
    public GeometrischeFormen letzteFigurAuslesen(){
    System.out.println("Das letzte FigurenObjekt ist");
    return figurenListe.getLast();
    }
    
    public void alleAnzeigen(){
      for(int i = 0; i < figurenListe.size();i++){
        System.out.println(figurenListe.get(i).toString());
      }

    }
    

     

  }
import java.util.*;
public class Testbett {

  public static void main(String[] args) {
    FigurenListe f1 = new FigurenListe();

    f1.figurAnfuegen(new Kreise(100));
    Kreise kreis = (Kreise)f1.get(0);

    
    
    f1.figurAnfuegen(new Rechtecke(2,1));
    Rechtecke rechteck = (Rechtecke)f1.get(1);

    
    f1.alleAnzeigen();
    
  }
}
🙂
 

Zurück
Oben