OOP Problem beim Berechnen der größten Fläche eines Ringes

ausgetrixt

Aktives Mitglied
Hallo,
ich habe ein kleines Problem und zwar...
Ich habe zwei Klassen programmiert (einen Frame und eine "normale" Ring-Klasse), die eine erzeugt einen Frame (und hat eine Main-Methode), die andere erzeugt "Ringe". Ich habe bereits einen Konstruktor, Getter/Setter, eine toString-Methode und eine Methode die mir die Fläche eines Ringes ausrechnet, wenn ich den Innenradius vom Außenradius abziehe. In dem Frame habe ich vier Buttons, die jeweils eine Funktion erfüllen. Alle Buttons funktionieren bisher wie sie sollen.
Doch hier mein Problem: Ich bin dabei den 4. Button zu programmieren. Er soll herausfinden welcher Ring in einem Ring-Array die größte Fläche hat. Ich habe es versucht zu lösen, habe es aber nicht hinbekommen, dass die Methode das macht was ich will :D. Meine Idee war es den Ring mit der größten Fläche an 1. Stelle des Arrays zu befördern mit Hilfe des Dreieckstausches. Nur bin ich mir nicht sicher ob die von mir gewählte Variable dafür richtig gewählt ist und ob die Methode an sich Sinn macht.
Ich wäre sehr froh, wenn mir jemand helfen könnte, Danke!

Meine Ring-Klasse:
Java:
public class Ring {

    private int innerradius;
    private int outerradius;
    private double area;
   
    //Konstruktor
    public Ring(int innerradius, int outerradius) {
        this.innerradius = innerradius;
        this.outerradius = outerradius;
    }
   
    //Setter und Getter:
    public int getInnerradius() {
        return innerradius;
    }
    public void setInnerradius(int innerradius) {
        this.innerradius = innerradius;
    }
    public int getOuterradius() {
        return outerradius;
    }
    public void setOuterradius(int outerradius) {
        this.outerradius = outerradius;
    }
   
    //Berechnung der Fläche des Ringes (Methode):
    public double calcArea() {
        double area = Math.PI * (this.outerradius * this.outerradius - this.innerradius * this.innerradius);
        this.area = area;
        return area;
    }

    //toString Methode:
    @Override
    public String toString() {
        return "Ring: innerradius = " + innerradius + ", outerradius = " + outerradius + ", area = " + String.format("%.2f", area);
    }
}
Mein Ring-Frame:
Java:
public class RingFrame extends JFrame {

    private JPanel contentPane;
    private JLabel l1;
    private JLabel l2;
    private JTextField t1;
    private JTextField t2;
    private JButton b1;
    private JButton b2;
    private JButton b3;
    private JButton b4;
   
    Ring [] ringArray = new Ring [20];
    int arrayCount = 0;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    RingFrame frame = new RingFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public RingFrame() {
        setResizable(false);
        setTitle("GLFS");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 250, 255);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
       
        l1 = new JLabel("Zahl 1:");
        l1.setBounds(10, 11, 46, 14);
        contentPane.add(l1);
       
        l2 = new JLabel("Zahl 2:");
        l2.setBounds(150, 11, 46, 14);
        contentPane.add(l2);
       
        t1 = new JTextField();
        t1.setBounds(10, 36, 86, 20);
        contentPane.add(t1);
        t1.setColumns(10);
       
        t2 = new JTextField();
        t2.setBounds(150, 36, 86, 20);
        contentPane.add(t2);
        t2.setColumns(10);
       
        b1 = new JButton("Action 1");
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Random random = new Random();
                int zufallszahl = 0;
                int maximum = 100;
                int minimum = 1;
               
                System.out.print("Zufallszahlen:    ");
                for (int i = 0; i < 10; i++) {
                    zufallszahl = random.nextInt(maximum + minimum);
                    System.out.print(zufallszahl + " ");
                }
               
                System.out.println();
               
                System.out.print("Zufallszahl (-5): ");
                while (zufallszahl > 5) {
                    System.out.print(zufallszahl + " ");
                    zufallszahl = zufallszahl - 5;
                }
            }
        });
        b1.setBackground(Color.LIGHT_GRAY);
        b1.setBounds(10, 80, 226, 23);
        contentPane.add(b1);
       
        b2 = new JButton("Action 2");
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                int ir = Integer.parseInt(t1.getText());
                int or = Integer.parseInt(t2.getText());
                Ring r = new Ring(ir, or);
               
                if (ir < or) {
                    System.out.print(r);
                } else {
                    System.err.println("Bitte geben Sie die Zahlen erneut ein!");
                }
            }
        });
        b2.setBackground(Color.LIGHT_GRAY);
        b2.setBounds(10, 114, 226, 23);
        contentPane.add(b2);
       
        b3 = new JButton("Action 3");
        b3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int ir = Integer.parseInt(t1.getText());
                int or = Integer.parseInt(t2.getText());
                Ring r = new Ring(ir, or);
               
                ringArray [arrayCount] = r;
                arrayCount++;
                System.out.println("\n---------------------------- Ringe ----------------------------");
               
                for (int i = 0; i < arrayCount; i++) {
                    r.calcArea();
                    System.out.println(arrayCount + ". " + ringArray [i]);
                }
            }
        });
        b3.setBackground(Color.LIGHT_GRAY);
        b3.setBounds(10, 148, 226, 23);
        contentPane.add(b3);
       
        b4 = new JButton("Action 4");
        b4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Ring tauschVariable = new Ring(0, 0);
                for (int i = 0; i < arrayCount; i++) {
                    if (ringArray [i].calcArea() < ringArray [i + 1].calcArea()) {
                        ringArray [i] = tauschVariable;
                        ringArray [i + 1] = ringArray [i];
                        tauschVariable = ringArray [i + 1];
                    }
                }
                System.out.println("Ring with max. area: " + ringArray [0]);
            }
        });
        b4.setBackground(Color.LIGHT_GRAY);
        b4.setBounds(10, 182, 226, 23);
        contentPane.add(b4);
    }
}
 

ausgetrixt

Aktives Mitglied
Ach ja... und das ist die Methode, die ich meine:
Java:
public void actionPerformed(ActionEvent e) {
                Ring tauschVariable = new Ring(0, 0);
                for (int i = 0; i < arrayCount; i++) {
                    if (ringArray [i].calcArea() < ringArray [i + 1].calcArea()) {
                        ringArray [i] = tauschVariable;
                        ringArray [i + 1] = ringArray [i];
                        tauschVariable = ringArray [i + 1];
                    }
                }
                System.out.println("Ring with max. area: " + ringArray [0]);
            }
 

Enceladus271

Bekanntes Mitglied
Bei der Zeile mit der if Abfrage wird eine ArrayIndexOutOfBoundsException geworfen. Die Abbruchbedingung in der Schleife muss i < arrayCount - 1 lauten. Aber auch dann wird der Code nicht das machen was du willst, denn
1. Beim ersten Betreten des if Blocks setzt du das erste Element auf new Ring(0,0) was keine Sinn macht
2. Wenn der gesuchte Ring am Ende des Arrays steht wird er nur einmal mit dem vorletzen vertauscht und steht somit nicht vorne

Warum machst du eigentlich so kompliziert? Iteriere doch einfach einmal über das Array und merke dir den Ring und die Fläche:
Code:
Ring rMax = null;
int aMax = 0;
for (Ring r : ringArray) {
  int a = r.calcArea();
  if (a>aMax) {
    aMax = a;
    rMax=r;
  }
}

Edit: Bitte beim nächsten mal eine genauere Fehlerbeschreibung. "Tut nicht das was ich will" könnte man durchaus genauer formulieren (Insbesondere wenn eine Exception geworfen wird, wie ich vermute)
 

ausgetrixt

Aktives Mitglied
Ich hab das jetzt so gemacht, wie du es mir geschrieben hast, es funktioniert jedoch noch immer nicht... Ich hab anstatt dem Datentyp int double genommen, funktioniert noch immer nicht :/
Java:
public void actionPerformed(ActionEvent e) {
                Ring rMax = null;
                double aMax = 0;
                for (Ring r : ringArray) {
                    double a = r.calcArea();
                    if (a>aMax) {
                        aMax = a;
                        rMax=r;
                    }
                }
                System.out.println("Ring with max. area: " + rMax);
            }
Es gibt eine Exception aus, in der Zeile 151 also:
Java:
double a = r.calcArea();
ist nicht richtig
 

ausgetrixt

Aktives Mitglied
Ich lese zwar Werte in mein Ring Array (mit dem Button 3) aber es wirft trotzdem eine Exception aus, wenn ich danach den Button 4 drücke
 

Enceladus271

Bekanntes Mitglied
Hast du das Array denn vollständig mit Ringen gefüllt? Ich denke mal es ist eine NullPointerException die in der Zeile auftritt. Gib mal den Inhalt des Arrays auf der Konsole aus. Ich kann auch nicht sehen wo du das Array füllst.
 

mrBrown

Super-Moderator
Mitarbeiter
Beim ersten Durchlauf der Schleife ist rMax null, und deshalb die NullPointerException ;)

Du kannst es zB auf den ersten Wert der Liste setzen ;)
 

Enceladus271

Bekanntes Mitglied
Beim ersten Durchlauf der Schleife ist rMax null, und deshalb die NullPointerException
Es wird rMax nur ein neuer Wert zugewiesen. Dort kann keine NPE auftreten.

Wenn ich das richtig sehe drückst du mehrmals Button 3 um das Array zu füllen. Ich denke das es dann noch nicht vollständig gefüllt ist. daher die NPE bei
double a = r.calcArea();
 

Enceladus271

Bekanntes Mitglied
Lösung ist sicherzustellen dass das Array vollständig gefüllt ist, oder in der Schleife bei der Berechnung der maximalen Fläche eine Prüfung durchzuführen ob r == null ist
 

ausgetrixt

Aktives Mitglied
Achso, dass heißt das Array muss volständig gefüllt sein... wie bekomme ich das hin, dass ich die größte Fläche zurückbekomme ohne, dass das Array voll sein muss?
 

mrBrown

Super-Moderator
Mitarbeiter
Es wird rMax nur ein neuer Wert zugewiesen. Dort kann keine NPE auftreten.

Wenn ich das richtig sehe drückst du mehrmals Button 3 um das Array zu füllen. Ich denke das es dann noch nicht vollständig gefüllt ist. daher die NPE bei
double a = r.calcArea();
Hab mich verlesen... :/


Achso, dass heißt das Array muss volständig gefüllt sein... wie bekomme ich das hin, dass ich die größte Fläche zurückbekomme ohne, dass das Array voll sein muss?
Du überspringst einfach alle Werte, die null sind
 

ausgetrixt

Aktives Mitglied
Hab das irgendwie so versucht, geht aber nicht :(
Java:
public void actionPerformed(ActionEvent e) {
                Ring areaMax = null;
                double aMax = 0;
                for (Ring r : ringArray) {
                    double a = r.calcArea();
                    if (a > aMax && ringArray[arrayCount] != null) {
                        aMax = a;
                        areaMax = r;
                    }
                }
                System.out.println("Ring with max. area: " + areaMax);
            }
 

Enceladus271

Bekanntes Mitglied
Die null Prüfung muss natürlich vor dem r.calcArea() ausgeführt werden:
Code:
Ring rMax = null;
int aMax = 0;
for (Ring r : ringArray) {
  if (r != null ) {
    int a = r.calcArea();
    if (a>aMax) {
      aMax = a;
      rMax=r;
    }
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
F Problem beim Speichern eines Attachments Allgemeine Java-Themen 3
M Problem beim Starten der Anwendung Allgemeine Java-Themen 3
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
GUI-Programmer JNI - Problem beim Erstellen der .dll Allgemeine Java-Themen 9
D Problem mit Referenzen beim Serialisieren Allgemeine Java-Themen 3
R Problem beim vCard Manipulieren Allgemeine Java-Themen 2
Rudolf Problem beim Visitorpattern Allgemeine Java-Themen 2
J Problem beim Auslesen einer Datei vom Server Allgemeine Java-Themen 4
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
U Mailclient über getDesktop.mail vorbereiten, Problem beim Anhang: Allgemeine Java-Themen 3
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
N Problem beim lesen einer File in JAR-File Allgemeine Java-Themen 3
N iText Problem beim verlinken anderer PDFs Allgemeine Java-Themen 2
M Problem beim Drucken von PDFs Allgemeine Java-Themen 3
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
I Problem beim Ausführen von Shell Commandos Allgemeine Java-Themen 3
O Problem beim Ausgeben von Arrays Allgemeine Java-Themen 9
L Problem beim animieren von Bildern in Applet Allgemeine Java-Themen 23
C Problem beim einlesen bestimmter Seiten Allgemeine Java-Themen 5
Apo JNI-Problem beim erneuten Laden einer dll Allgemeine Java-Themen 28
S Problem beim Drucken auf Netzwerkdrucker unter Linux Allgemeine Java-Themen 9
S Problem beim Anlegen eines JDialogs! Allgemeine Java-Themen 4
A Problem mit ShutdownHook beim schließen Allgemeine Java-Themen 7
S Problem beim Löschen des Inhalts des Fensters Allgemeine Java-Themen 4
A Problem beim serialisieren/deserialisieren einer ArrayList Allgemeine Java-Themen 3
M Problem beim Umrechnen von Pixel in cm. Allgemeine Java-Themen 6
M Problem beim ausführen von Batchdateien Allgemeine Java-Themen 21
Escorter Problem beim starten von Batchfiles Allgemeine Java-Themen 4
A Problem beim Starten der H2-Datenbank Allgemeine Java-Themen 4
L WindowsTrayIcon in Java 1.4 - Problem beim ausführen der JAR Allgemeine Java-Themen 2
E Problem beim Anlegen einer Datei Allgemeine Java-Themen 4
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
G Problem beim starten von eclipse product Allgemeine Java-Themen 2
M Problem beim Erstellen eines Objektes Allgemeine Java-Themen 3
M Problem beim laden von vielen Bildern Allgemeine Java-Themen 16
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
H Problem beim Malen auf ein Panel Allgemeine Java-Themen 2
G iText: Problem beim Drucken von AcroFormen Allgemeine Java-Themen 2
E Problem beim fertigen Programm die Hintergrundfarbe ändern Allgemeine Java-Themen 8
karambara Sonderzeichen-Problem beim Lesen und Speichern von Dateien Allgemeine Java-Themen 6
R Problem beim Datentransfer Allgemeine Java-Themen 19
C Problem beim Umstieg von Java1.4 auf 1.5 Allgemeine Java-Themen 5
K javax.comm Problem beim starten aus .jar heraus Allgemeine Java-Themen 3
S Problem beim Bearbeiten von Java-Dateien unter Linux Allgemeine Java-Themen 3
S Hab ein Problem! Bei Dame! Beim Umranden! Allgemeine Java-Themen 2
G Problem beim speichern von Dateien Allgemeine Java-Themen 8
M Problem mit PageFormat beim Drucken Allgemeine Java-Themen 2
Streeber Problem beim Kompilieren und Ausführen Allgemeine Java-Themen 20
E Problem beim Compilieren Allgemeine Java-Themen 6
O JNI Problem beim kompilieren Allgemeine Java-Themen 2
M Codepage Problem (Vertauscht Zeichen beim Lesen aus Datei) Allgemeine Java-Themen 3
P Problem beim "spliten" eine Textdatei Allgemeine Java-Themen 3
F Problem beim Drucken mit javax.print Allgemeine Java-Themen 2
Z Problem beim Aufruf eines Listener? Allgemeine Java-Themen 4
bernd Problem beim kopieren! Allgemeine Java-Themen 2
B problem beim erstellen einer ausführbaren jar-datei Allgemeine Java-Themen 5
A Problem beim Aufruf von javac Allgemeine Java-Themen 7
J JFrame Problem beim schließen Allgemeine Java-Themen 2
S Problem beim Zugriff auf Internetseiten Allgemeine Java-Themen 4
R Problem beim speichern von eigenem objekt Allgemeine Java-Themen 6
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben