Grundrechenarten mit eigenen Typen

fryasdf

Neues Mitglied
Hallo.

Schon oefter habe ich mich gefragt, ob man Java beibringen kann, wie es Plus, Minus, usw. auf selber definierten Objekten zu rechnen hat. Sagen wir dass wir folgende Klasse haben:

Java:
public class RationalNumber
{
   public int numerator, denominator;
   [...]
}

Jetzt moechte ich gerne sagen koennen

Java:
RationalNumber x = new RationalNumber();
RationalNumber y = new RationalNumber();
x.numerator = 1;
x.denominator = 2;
y.numerator = 1;
y. denominator = 3;

RationalNumber z = x + y;

Ich habe das bisher immer ueber
Java:
public static RationalNumber add(RationalNumber x, RationalNumber y) {
 [...]
}

geloest aber das fuehrt doch zu haeufig zu Fehlern wenn die Rechnungen kompliziert werden... Gibt es da so ein Standard Interface mit dem man das wie oben machen kann?

thx

fryasdf
 

Marco13

Top Contributor
Leider* nein.


(* "Leider" weil es manchmal praktisch wäre, aber ... man könnte SO viel Mist damit machen, dass man zumindest davon ausgehen kann, dass dadurch einige :autsch:'s vermieden werden...)
 

I.Haffner

Mitglied
Wie schon gesagt geht das nicht, da Java ein Überladen der Operatoren nicht zulässt (wie es zB bei C++ möglich ist). Allerdings ist das auch nicht nötig.Du kannst dir deine eigenen Zahlen selber erstellen in dem du mit deiner eigenen Klasse zum einen die abstrakte Klasse Number erweiterst und Comparable<?> implementierst.
Ich hab das schonmal für Brüche gemacht. Bitte sehr:
Java:
public interface Fraction{
	
	int numerator();
	int denominator();
	void add(Fraction a);
	Fraction sum(Fraction a);

}

Java:
public class MyFraction extends Number implements Comparable<MyFraction>, Fraction {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6360128714276017883L;
	
	private Integer denominator, numerator;
	
	public MyFraction(int n, int d) throws Exception{
		if(d==0) throw new Exception("Divisor is Zero");
		denominator = d;
		numerator = n;
		reduce();
	}
	
	public MyFraction(Integer n, Integer d){
		denominator = d;
		numerator = n;
		reduce();
	}

	@Override
	public int compareTo(MyFraction o) {
		int i = this.numerator * o.denominator - o.numerator * this.denominator;
		if(i>0) return 1;
		if(i<0) return -1;
		return 0;
	}

	public int numerator() {
		return numerator;
	}

	public int denominator() {
		return denominator;
	}
	
	private void reduce(){
		int gcd = MyMath.gcd(numerator, denominator);
		numerator = numerator/gcd;
		denominator = denominator/gcd;
	}

	@Override
	public void add(Fraction a) {
		this.numerator = this.numerator * a.denominator() + a.numerator() * this.denominator;
		this.denominator *= a.denominator();
		reduce();
	}

	@Override
	public MyFraction sum(Fraction a) {
		int n = this.numerator * a.denominator() + a.numerator() * this.denominator;
		int d = this.denominator * a.denominator();
		try {
			return new MyFraction(n, d);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public double doubleValue() {
		return (double) numerator / denominator;
	}

	@Override
	public float floatValue() {
		return (float)numerator / denominator;
	}

	@Override
	public int intValue() {
		return (int)(numerator / denominator + 0.5);
	}

	@Override
	public long longValue() {
		return (long)(numerator / denominator + 0.5);
	}
	
	@Override
	public String toString(){
		return numerator.toString() + "/" + denominator.toString();
	}

}

Das Interface ist eigentlich sehr Überflüssig : )
 
E

emailundlos

Gast
Ich hab das schonmal für Brüche gemacht. Bitte sehr:

Was genau hast du denn schon einmal damit gemacht? die Brüchen, also dein Bruch, ist unzureichend beschrieben oder? es wurden einfach die Namen übernommen, die fryasdf eingebracht hatte. Ich bin auch gerade dabei mir das beizubringen. Vielleicht hab ich ja Glück.
 

I.Haffner

Mitglied
die von mir erstellte Klasse
Code:
MyFraction
ist nun von der art wie
Code:
Integer
oder
Code:
Double
. Du kannst
Code:
MyFraction
mit
Code:
Double
oder
Code:
Integer
vergleichen, du kannst
Code:
MyFraction
mit
Code:
Double
und
Code:
Integer
verrechnen und durch die Implementierung von
Code:
Comparable<T>
steht dir auch eine
Code:
int compareTo(Object o)
Methode zur Verfügung mit der du Objekte mit einem Bruch vergleichen kannst. Diese compareTo-Methode sollte so implementiert werden, dass man eine Wohlordnung über seine Objekte bekommt.

PS: Habe meinen Code etwas überarbeitet.

Code:
MyFraction
implementiert jetzt
Code:
Comparable<Object>
und daraus folgt:
Java:
@Override
	public int compareTo(Object o) {
		MyFraction f = (MyFraction) o;
		int i = this.numerator * f.denominator - f.numerator * this.denominator;
		if(i>0) return 1;
		if(i<0) return -1;
		return 0;
	}
Ich denke das ist besser so.

PPS: Ich rate mal davon ab die compareTo-Methode über
Code:
Number.doubleValue()
zu implementieren, da
Code:
double
eine gewisse Ungenauigkeit hat was zu Problemen bei großen Brüchen werden kann : )
 
Zuletzt bearbeitet:

Marco13

Top Contributor
In der compareTo brutal zu casten kann zu viel gravierenderen Problemen führen. Man könnte sich überlegen, sowas wie
MyFraction extends Number implements Comparable<Number>
zu machen...
 

I.Haffner

Mitglied
ja der cast ist brutal. allerdings soll
Code:
int compareTo(Object o)
ja alle objekte akzeptieren. und außerdem wirft die methode auch eine cast-exception. hatte es vorher anders, aber so ist es besser denke ich. zB lässt sich jetzt das compare auf objecte anwenden die den statischen typ object haben aber dynamisch vom typ MyFraction sind, das ginge anders nicht ; )
 

Marco13

Top Contributor
Naja... man kann eine Fraction ja nicht mit wirklich beliebigen Typen vergleichen, sondern erstmal nur mit Zahlen - von daher könnte es sich IMHO anbieten, von Number zu erben. Aber das muss man sich halt mal genauer überlegen.
 

I.Haffner

Mitglied
mal angenommen du hast einen generator für ein array eines bliebigen statischen typs (der number und comparable implementiert) aber du weißt nicht um was für einen dynamischen typ es sich handelt.
jetzt beschließt du einen sortieralgorithmmus zu implementieren (oder minimum finden oder binary search oder iwas derartiges). dann müsstest du jedes mal prüfen von welchem dynamischen typ dein objekt ist (mit instanceof) und es dann casten. so kannst du jedoch einfach hingehen und compareTo aufrufen.

sagen wir dein generator kann die Interger[], Double[] und MyFraction[] liefern, aber du hast nur ein array vom typ Comparable<?>[] um die rückgabe zu speichern.
ich denke jetzt ist klar warum int compareTo(Object o) ein beliebiges Objekt akzeptiert ; )

PS: du kannst ja zB auch eine wohlordnung auf strings definieren, aber String ist kein Number!
 

Marco13

Top Contributor
Die Frage, welchen Typ ein Array hat, der von einer hypothetischen Klasse geliefert wird, hat IMHO nichts damit zu tun, dass compareTo(Object) keinen Sinn macht. Aber vielleicht reden wir aneinander vorbei.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Addons im eigenen Programm Allgemeine Java-Themen 1
E Eigenen "Aufzählungstyp" erstellen - mit enum ? Allgemeine Java-Themen 18
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
dereki2000 Eigenen Zeichensatz benutzen Allgemeine Java-Themen 7
B JAVA Prozesse in einer eigenen Anwendung laufen lassen Allgemeine Java-Themen 9
J Java eigenen Button programmieren (ob Cursor im Rechteck ist oder nicht..../button pressed or not) Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
C Bufferoverflow beim eigenen simpeln Programm Allgemeine Java-Themen 4
D Eigenen Objekt Pool Allgemeine Java-Themen 15
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9
D eigenen eventListener Allgemeine Java-Themen 5
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
H2SO3- jar soll eigenen namen(pfad) finden Allgemeine Java-Themen 12
R Eigenen Comparator schreiben ? Allgemeine Java-Themen 10
G Kennt jemand gute Produkte zum Lizensieren der eigenen Apps? Allgemeine Java-Themen 6
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
thE_29 Java Prozesse der eigenen JVM Allgemeine Java-Themen 12
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
C Eigenen Layout Manager schreiben Allgemeine Java-Themen 7
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
M eigenen Desktop erzeugen Allgemeine Java-Themen 3
G hat jeder thread seinen eigenen stacktrace? Allgemeine Java-Themen 2
F Eigenen E-MailClient als Standart definieren Allgemeine Java-Themen 7
F "source not found" in eigenem Projekt mit eigenen Allgemeine Java-Themen 2
G ||| Textdateien aus dem eigenen Projekt lesen. Allgemeine Java-Themen 16
D close Problem bei meinem eigenen ToolTip Allgemeine Java-Themen 2
F Dateien auf dem eigenen Server verändern? Allgemeine Java-Themen 3
M Eigenen Datentyp erstellen Allgemeine Java-Themen 4
N Konsole im eigenen Java-Programm Allgemeine Java-Themen 4
N warning beim compilieren des eigenen TableRenderers Allgemeine Java-Themen 5
G Fenster durch eigenen Button minimieren Allgemeine Java-Themen 6
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
M Generics / Typen Allgemeine Java-Themen 1
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
N Vergleich von generischen Typen Allgemeine Java-Themen 2
S Überschriebene Methode eines generischen Typen aufrufen Allgemeine Java-Themen 4
K Arrays.asList und primitive Typen Allgemeine Java-Themen 2
H2SO3- problem mit objecten verschiener Typen (E, <E> und T) Allgemeine Java-Themen 2
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
T DataFrame (Matrix mit mit verschiedenen Typen pro Spalte) Allgemeine Java-Themen 4
H2SO3- merken versch. Date Typen + erlaubte und unerlaubte kombinat Allgemeine Java-Themen 4
V Variable vom Typ String zum Typen "Message" konve Allgemeine Java-Themen 2
F Kann man keine Arrays von generischen Typen erstellen? Allgemeine Java-Themen 2
Q Typen von Generics & Casten Allgemeine Java-Themen 3
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
lumo Typen MSSQL + JAVA Allgemeine Java-Themen 4
B Generische Typen instanzieren Allgemeine Java-Themen 11
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Methoden auf Arrays aller primitiver Typen zusammenfassen? Allgemeine Java-Themen 8
C Dynamisch Objekte unterschiedlicher Typen erzeugen Allgemeine Java-Themen 6
S Variablennamen von primitiven Typen eines Konstruktors lesen Allgemeine Java-Themen 7
J parsen von verschiedenen dokument typen Allgemeine Java-Themen 3
S generics primitiver typen Allgemeine Java-Themen 5
D generischer Iterator mit verschiedenen Typen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben