Methoden Prozentualer Anteil berechnen

ninis

Mitglied
Hallo, ich habe folgendes Problem:

Ich muss eine Literaturverwaltung programmieren bei dem ich verschiedene Anwendungsfälle implementieren muss.
Bei einem Anwendungsfall komme ich nicht weiter:
Ich muss den prozentualen Anteil der besonders interessanten Literaturstellen in Echtzeit (Also pro hinzugefügte Literaturstelle) ausgeben.
Eine Literaturstelle kann somit beim Attribut Besonders Interessant die Werte Ja und Nein annehmen:

Java:
 private Object interessant;

Java:
 public void setInteressant(Object object){
	    
	    this.interessant = object;
	  }
	  
	  /**
	   * Diese Methode gibt Info darüber ob eine Literaturstelle interessant ist, oder eben nicht.
	   * @return zerbrechlich
	   */
	  public Object getInteressant()
	  {
	    if(interessant == null)
	    {
	      interessant = "";
	    }
	    return interessant;
	  }



Java:
 public static final String INTERESSANT[]={
		    
		    "Ja",
		    "Nein"
		    
		    
		  };
		    
}

Der Methodenname um den prozentualen Anteil von besonders interessanten Literaturstellen:
Java:
 public double prozentInteressant()

Meine Frage, wie kann ich abrufen, dass eine Literaturstelle besonders interessant ist, da ich diesen Prozess für meinen Algorithmus benötige (Algorithmus: Summe Anzahl interessanter Büchter / Summe gesamter Bücher)?
Und kann ich das ganze dann mit den get() und set() ebenfalls ausgeben?
 
Den Anwendungsfall den durchschnittlichen Anteil der Wörter je Literaturstelle habe ich hier schon fertig.
Kann man sich daran orierntieren?

Java:
public double durchWoerter(){

	    Iterator<LiteraturstelleInfo> iterator = literaturstelleListe.iterator();
	    int i;
	    
	    double durchWoerter = 0;

	    while(iterator.hasNext())
	    {
	      LiteraturstelleInfo l = iterator.next();
	      durchWoerter =durchWoerter+ l.getWoerter()/literaturstelleListe.size();
	      
	    }
	    
	    durchWoerter = Math.floor(durchWoerter*100)/100.0; // gekürzt
	    
	    return durchWoerter;
  }
 
Wieso machst du eine Eigentschaft, die nur die Werte ja/nein annehmen kann zum Datentyp Object bzw. String? :autsch:
Das ist ein typischer Fall für ein boolean. Und dann einfach über alle Elemente iterieren, wenn ein Buch interresant ist einen Counter hochzählen. Prozentsaz ist dann:
Java:
double prozent=100.0*interresant/gesamt;
 
Du meinst also ich soll gar kein Objekt Interessant erstellen, sondern ein Interessant mit Datentyp Boolean?
Aber wie kann ich dann sagen, wenn das true ist = ja und wenn das false ist = nein.?
Ich muss das ja in der GUI anwählen können...
 
Das Problem jetzt ist nur, dass ich nicht mehr auf die Auswahl zugreifen kann:
Habe vorher alles von Object in Boolean geändert.

Fehler:
Java:
 model.setInteressant(EingabeLiteraturstelleInteressant.getSelectedItem());

Ich brauche ja dafür ein Object, oder brauch ich dafür eine andere Methode`?
 
Zuletzt bearbeitet:
Wenn ich nämlich auf ein Double.-Wert zugreifen muss benutze ich ja folgenden Code:
Java:
 model.setWoerter (Double.parseDouble(EingabeLiteraturstelleWoerter.getText()));
		    if(model.getWoerter()<0)
		    {
		      model.setWoerter(0); 
		      InformationDialog.vorsicht();
		    }
 
Ich hab das Object Besonders Interessant, ja in einer CheckBox wo der User entscheiden kann, ob die Literaturstelle interessant ist oder nicht.
Die Checkbox bezieht sich ja auf die Stammdaten des Strings INTERESSANT.
Ich brauche halt die Methode um diesen String "ja" abzufragen, für den prozentualen Anteil.
Mit boolean bekomme ich irgendwie nicht hin..
 
Was ist daran so schwer?

Java:
public double prozentInterresant(){
        Iterator<LiteraturstelleInfo> iterator = literaturstelleListe.iterator();
        int interresant=0;
        
        while(iterator.hasNext())
        {
          LiteraturstelleInfo l = iterator.next();
          if(l.isInterresant())
           interessant++;
        }
        return (interresant*100.0)/literaturstelleListe.size();
   }

Und für das erstellen, weis ich auch nicht wo das Problem seien soll.
Java:
LiteraturstelleInfo l=...;
l.setInterresant(interresantCheckBox.isSelected());

Kann es sein, dass du CheckBox und ComboBox verwechselst?
 
Ja den Algorithmus habe ich ja verstanden mit dem umrechnen.

Und du hast recht ich hab die beiden "Boxen" vertauscht.

Das Problem ist, dass ich mit vorher mit der ComboBox gearbeitet hab um entweder Ja oder Nein auszuwählen:
Java:
 private JLabel LabelEingabeLiteraturstelleInteressant = new JLabel();
		  private JComboBox EingabeLiteraturstelleInteressant = new JComboBox(Stammdaten.INTERESSANT);

Ich kann ja nicht einfach anstatt Combo auf Check ändern.
Wie mache ich das denn innerhalb der Checkbox, dass das besonders Interessant Ja oder Nein hat?
 
Mal angenommen ich würde aus der ComboBox die Checkbox machen:
WIe ändere ich folgende Codes dann hinsichtlich der Combobox

Java:
	    EingabeLiteraturstelleInteressant.setSelectedItem(model.getInteressant());

model.setInteressant(EingabeLiteraturstelleInteressant.getSelectedItem());

public void setInteressant(Object object){
	  if(interessant == null)
	    {
	      interessant = "";
	    }
	    
	    this.interessant = interessant;
	  }
 
Denn eigentlich möchte ich das gerne als Combobox behalten (passt optisch besser in der GUI):

So müsste ich doch nur folgende Codezeilen von dir:

Java:
if(l.isInterresant())
           interessant++;

So umschreiben, dass der das der String "Ja" von dem Objekt Interessant lesen kann oder nicht?
Nur wie macht man das?
 
Das halte ich für den falschen Weg. Besser wäre es das Setzen anzupassen. Zwei Möglichkeiten gibts dazu:

Java:
model.setInteressant(EingabeLiteraturstelleInteressant.getSelectedItem());
 
public void setInteressant(Object object){
      if(!(object==Datenstelle.INTERRSANT[0] || object==Datenstelle.INTERRSANT[1]))
          throw new IllegalArgumentException();
      interessant = (object == Datenstelle.INTERRSANT[0]);
}
oder die strukturell besere Variante:
Java:
model.setInteressant(EingabeLiteraturstelleInteressant.getSelectedItem()==Datenstelle.INTERRESANT[0]);
 
public void setInteressant(boolean inter){
      interessant = inter;
}

Stringvergleiche mit == sind in dem Fall erlaubt, weil es immer die selbe Instantz ist. Im Normalfall sollten Strings mit equals verglichen werden.
 
Das INTERRSANT soll das INTERESSANT der Stammdaten sein nehme ich an?

Was meinst du mit Datenstelle? Soll ich da eine weitere Variable erstellen?

Und wie müsste ich dann den Algorithmus umstellen, dass ich den prozentualen Anteil berechnen kann?
also die prozentInteressant-Methode?
 
Ich hatte das Array gemeint:
Code:
Stammdaten.INTERESSANT
, das du auch beim erzeugen der ComboBox verwendest.

Und an meinem schon geposteten Algorithmus must du gar nichts mehr verändern. Nur die get Methode sowie den Datentyp für Interresant von LiteraturstelleInfo entsprechend anpassen.
 
Achso du meinst da muss dann Stammdaten.INTERESSANT hin.

Alles klar, sorry.

Jetzt habe ich allerdings einen Fehler noch bei deinem Algorithmus:
Java:
public double prozentInterresant(){
      Iterator<LiteraturstelleInfo> iterator = literaturstelleListe.iterator();
      int interresant=0;
      
      while(iterator.hasNext())
      {
        LiteraturstelleInfo l = iterator.next();
        if(l.isInterresant())
        	interresant++;
      }
      return (interresant*100.0)/literaturstelleListe.size();
 }

Das
Java:
if(l.isInterresant())
ist fehlerhaft.Warum?

*habe noch diesem Muster weitergemacht:

Java:
model.setInteressant(EingabeLiteraturstelleInteressant.getSelectedItem());
 
public void setInteressant(Object object){
      if(!(object==Datenstelle.INTERRSANT[0] || object==Datenstelle.INTERRSANT[1]))
          throw new IllegalArgumentException();
      interessant = (object == Datenstelle.INTERRSANT[0]);
}
 
Zuletzt bearbeitet:
Und an meinem schon geposteten Algorithmus must du gar nichts mehr verändern. Nur die get Methode sowie den Datentyp für Interresant von LiteraturstelleInfo entsprechend anpassen.

Steht da doch. Für dich noch mal ganz langsam alles was in der Klasse zur Eigenschaft interresant stehen sollte:

Java:
private boolean interressant;

public void setInteressant(Object object){
      if(!(object==Datenstelle.INTERRSANT[0] || object==Datenstelle.INTERRSANT[1]))
          throw new IllegalArgumentException();
      interessant = (object == Datenstelle.INTERRSANT[0]);
}

public boolean isInterresant(){
    return interressant;
}

Ein paar gewisse Kernkompetenzen im Selberdenken sind bei dir bisher etwas schlecht ausgebildet.
Das gehört auch zum Programmieren dazu. Wenn man nicht fähig ist das kleinste Codestück zu verstehen und kleinere Fehler/ Abweichungen an seine Bedürfnisse anpassen zu können, hat man auf Dauer ein großes Problem.
 
Ja aber trotzdem gibt jetzt die GUI immer noch nicht den Anteil in Prozent aus. Steht am Beginn Nan und danach immer auf 0.0 obwohl ich Literaturstellen hinzufüge:

Mein Code nun ist:
Java:
private String titel;
	  private String vorname;
	  private String nachname;
	  private Object quellenart;
	  
	  private double woerter;
	  private Object interessant;
	  private String quellenangabe;

Java:
private boolean interressant;
	  public void setInteressant(Object object){
		  if(!(object==Stammdaten.INTERESSANT[0] || object==Stammdaten.INTERESSANT[1]))
	          throw new IllegalArgumentException();
	      interessant = (object == Stammdaten.INTERESSANT[0]);
	
		    
		   
		  }
	   
	  public boolean isInterresant(){
		    return interressant;
		}
	  
	  /**
	   * Diese Methode gibt Info darüber ob eine Literaturstelle interessant ist, oder eben nicht.
	   * @return interessant
	   */
	  public Object getInteressant()
	  {
	    if(interessant == null)
	    {
	      interessant = "";
	    }
	    return interessant;
	  }

Java:
public double prozentInterresant(){
      Iterator<LiteraturstelleInfo> iterator = literaturstelleListe.iterator();
      int interresant=0;
      
      while(iterator.hasNext())
      {
        LiteraturstelleInfo l = iterator.next();
        if(l.isInterresant())
            interresant++;
      }
      return (interresant*100.0)/literaturstelleListe.size();
 }

Hab alles gemacht was du gesagt hast und trotzdem klappt es nicht. 🙁
 
Das Problem kann aber nicht in dem geposteten/meinem Code stecken. Entweder es läuft beim setzen / formatieren irgendwas schief, mit der Datenhaltung stimmt was nicht oder es wird einfach der Wert überhaupt nicht aktuallisiert.
 
Liegt das vielleicht daran, dass das "Interessant" von uns jeweils unterschiedlich geschrieben wurde oder ist das egal?

Woran könnte es dann liegen, wenn es nicht aktualisiert wird?


Liegt es vll. daran?

Java:
public Object getInteressant()
	  {
		  if(interessant == null)
		    {
		      interessant = "";
		    }
	    return interessant;
 
Java:
	      interessant = (object == Stammdaten.INTERESSANT[0]);

	      interessant = "";
Mal abgesehen davon, dass man vor lauter "interessant" den Code kaum noch lesen kann, ist des denn Absicht, dass der Variablen
Code:
interessant
mal ein boolean und mal ein String zugewiesen wird. Denke das ist nicht beabsichtigt.
 
So ein Mist durch die throw
Java:
new IllegalArgumentException();

kann ich die gespeicherten Daten nicht mehr lesen.
Jemand ne Ahnnung wie ich das jetzt wieder hinbekomme?
 
Ist denn das werfen der Exception berechtigt? Diese wird ja - laut Code in den anderen Posts - geworfen, wenn das Object (warum wird hier nur allgemein Object verwendet und nicht ein konkreter Typ oder ein Interface?) nicht identisch mit Index 0 oder 1 des Stammdaten Arrays ist. Achtung ein gleich reicht hier nicht aus, da auf Identität geprüft wird.

Ansonsten würde ich, wenn ich schon eine Exception werfe, da wenigstens eine Fehlermeldung mitgeben.
 
Hä??? Dadurch das in der set Methode eine Exception geworfen wird, wenn aus welchem Grund auch immer ein falscher Wert übergeben wird, kannst du die get Methode nicht mehr aufrufen?

Ich bin davon ausgegangen, dass hier kein equals nötig ist, da man ja immer mit den selben Instanzen arbeitet. Wäre natürlich ein besser, macht den Code aber immer noch nicht gut. Und zum Fehlermeldungen zu erfinden für andere Leute, die nur Copy&Paste beherrschen, war ich einfach zu faul.
 
Java:
private boolean interressant;
	  public void setInteressant(Object object){
		  if(!(object==Stammdaten.INTERESSANT[0] || object==Stammdaten.INTERESSANT[1]))
	          throw new IllegalArgumentException();
	      interressant = (object == Stammdaten.INTERESSANT[0]);
	
	      this.interessant = object;
		   
		  }
	   
	  public boolean isInteressant(){
		
		    return interressant;
		}

Das ist der Code mit der Exception, die die Literaturstelle Interessant oder nicht Interessant macht.
Brauchte diese Methode um später den prozentualen Anteil interessanter Literaturstellen zu berechnen.

Fehlercode ist:

java.lang.IllegalArgumentException
at gruppe02.mvc.model.LiteraturstelleInfo.setInteressant(LiteraturstelleInfo.java:159)
at gruppe02.mvc.model.LiteraturstelleInfoDAO.readFromStream(LiteraturstelleInfoDAO.java:70)
at gruppe02.mvc.model.LiteraturstellenDAO.readFromFile(LiteraturstellenDAO.java:81)
at gruppe02.mvc.gui.LiteraturstelleHandler.readFromFile(LiteraturstelleHandler.java:270)
at gruppe02.mvc.gui.LiteraturstelleHandler.actionPerformed(LiteraturstelleHandler.java:201)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Deine Namensvergabe bei Variablennamen ist ja gemeingefährlich. Zunächst einmal würde ich sprechende und voneinander leicht unterscheidbare Variablennamen verwenden.

Die Exception wirfst Du selbst in Zeile 4 und zwar wenn die Bedingung
Code:
!(object==Stammdaten.INTERESSANT[0] || object==Stammdaten.INTERESSANT[1])
erfüllt ist. Viel mehr kann man dazu nicht sagen. Also wenn object weder Stammdaten.INT...[0] noch Stammdaten.INT...[1] ist
 
Aber die muss ich doch erstellen, um in der prozentInteressant()-Methode den prozentualen Anteil zu berechnen.
Oder gibt es da eine andere Möglichkeit?
 
Ich hab zwar keine Ahnung was du da treibst, und was eine readFromFile Methode in dem StackTrace zu suchen hat, aber in dem Fall ist wohl doch equals angesagt, also so:
Java:
public void setInteressant(Object object){
          if(!(Stammdaten.INTERESSANT[0].equals(object) || Stammdaten.INTERESSANT[1].equals(object)))
              throw new IllegalArgumentException();
          interressant = Stammdaten.INTERESSANT[0].equals(object);
          //this.interessant = object;
          //was soll das den????
          // die hättest du löschen sollen
          }
 
Ich hab zwar keine Ahnung was du da treibst, und was eine readFromFile Methode in dem StackTrace zu suchen hat, aber in dem Fall ist wohl doch equals angesagt, also so:
Java:
public void setInteressant(Object object){
          if(!(Stammdaten.INTERESSANT[0].equals(object) || Stammdaten.INTERESSANT[1].equals(object)))
              throw new IllegalArgumentException();
          interressant = Stammdaten.INTERESSANT[0].equals(object);
          //this.interessant = object;
          //was soll das den????
          // die hättest du löschen sollen
          }

Das habe ich auch schon versucht, trotzdem kann ich immer noch nicht die gespeichere Datei lesen..
 
Gehe das Problem doch Schritt für Schritt an.
Dein Problem ist es eine Datei einzulesen? Dann lies einfach nur die Datei ein und gib z.B. deren Inhalt per System.out.println aus.
 
Dann könnte es ja, rein theoretisch, daran liegen, wie du die Datei liest oder schreibst.
Grausames Design zieht grausame Fehlersuche nach sich.
 
Das Problem ist, wenn ich das Programm in Eclipse öffne, dann kann ich auch die Dateien lesen, wenn ich sie vorher gespeichert habe.
Exportiere ich es jedoch als .jar File funktioniert das Ganze nicht..
 

Neue Themen


Zurück
Oben