Array mit verschiedene Datentypen als Rückgabewert? (Long und Double)

FelixN

Mitglied
Hi ,

ich möchte gerne aus einer statischen Methode ein Array mit zwei Elementen zurückgeben, eines muss Typ Double sein und eines muss Typ Long sein.

Bei dem ersten Wert mit 2^n Möglichkeiten handelt es sich um den Typ Long, den ich zwingend als Long in der nächsten Methode brauche. Der andere Wert ist ein Double, häufig mit vielen Nachkommastellen. Ein casten zu Long führte mir da immer zu Datenverlust. Ein casten des Long zu Double lieferte mir auch immer falsche Werte am Ende. Geht darum aus einer Menge M mit n Elementen die Teilemengensumme zu finden, die sich pi am meisten annähert.

Wenn ich die Methode einfach überlade und den Rückgabetyp ändere, funktioniert alles. Aber ist das nicht Laufzeittechnisch total doof, die gesamte Methode nochmal rennen zu lassen obwohl man den Wert schon berechnet hat ? Das Aufgaben Testsystem der Uni meckert da nicht, aber ich dachte das muss doch schöner gehen?

[CODE lang="java" title="SubsetSum"] public static double [] besteTeilSumme (double [] eingebeneMenge) {

double besteSum = eingebeneMenge[0];
long xCount = 0;
double pi = Math.PI;


for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
double zwischenSumme = 0;
for (int i = 0; i < eingebeneMenge.length; i++) {
long binaerStelle = (x >> i) & 1;

if (binaerStelle == 1) {
zwischenSumme = zwischenSumme + eingebeneMenge;
}
}

if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
xCount = x;
besteSum = zwischenSumme;
}
}


// hier kommt es immer zu Verlust

double [] loesungsWerte = new double[2];
loesungsWerte [0] = xCount; // wird benötigt um in anderer Methode die Menge zu finden
loesungsWerte [1] = besteSum; // wird in Aufgabenstellung als Angabe erwartet und auch benötigt

return loesungsWerte;
}[/CODE]

Das wäre die Lösung mit zwei eigenen Methoden, die funktionieren würde..
Java:
 public static double besteTeilSumme (double [] eingebeneMenge) {

        double besteSum = eingebeneMenge[0];
        long xCount = 0;
        double pi = Math.PI;


        for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
            double zwischenSumme = 0;
            for (int i = 0; i < eingebeneMenge.length; i++) {
                long binaerStelle = (x >> i) & 1;

                if (binaerStelle == 1) {
                    zwischenSumme = zwischenSumme + eingebeneMenge[i];
                }
            }

            if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
                xCount = x;
                besteSum = zwischenSumme;
            }
        }

        return besteSum;

    }

    public static long xCount (double [] eingebeneMenge) {

        double besteSum = eingebeneMenge[0];
        long xCount = 0;
        double pi = Math.PI;


        for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
            double zwischenSumme = 0;
            for (int i = 0; i < eingebeneMenge.length; i++) {
                long binaerStelle = (x >> i) & 1;

                if (binaerStelle == 1) {
                    zwischenSumme = zwischenSumme + eingebeneMenge[i];
                }
            }

            if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
                xCount = x;
                besteSum = zwischenSumme;
            }
        }

        return xCount;

    }
 
Also ein Array zeichnet sich dadurch aus, dass alle Elemente vom gleichen typ sind. Daher ist diese Herangehensweise extrem schlecht.

Prinzipiell kannst Du (technisch) das so machen, dass Du entsprechend einen Obertypen nimmst. Also ein Array von Object oder bei dann evtl. Number, da alle Wrapper typen (Long, Double) von Number erben.

Generell ist aber die Frage: Was besagen denn diese zwei Werte? Da könnte man einfach eine Klasse erstellen, die dies dann abbildet und die dann zwei Elemente hat, die dann zudem auch noch sinnvoll benannt sind....
 
Gibt doch einfach einen eigenen Datentyp zurück!
Java:
class MeinDatentyp {
    long wert1;
    double wert2;
  
    public MeinDatentyp(long wert1, double wert2) {
        this.wert1 = wert1;
        this.wert2 = wert2;
    }
}

public MeinDatentyp irgendeineMethode() {
    // mehr Code
    return new MeinDatentyp(wert1, wert2);
}
Der Klasse und den Instanzvariablen solltest du natürlich sinnvolle Bezeichnungen geben.
 

Neue Themen


Zurück
Oben