Mit i statt 0 hast du Recht. Habe ich ausgebessert.
Wenn du keinen Betrag verwenden willst, gibt es auch andere Wege. Du kannst die Zahl quadrieren, dann wird sie auch positiv. Oder du baust dir selbst einen Betrag mit if (zahl < 0) zahl *= -1;.
neuling96
Zitat:
Original von eulerscheZahl
Jetzt findet das Programm auch den richtigen Wert.
ein paar Verbesserungsvorschläge:
Den Mittelwert würde ich nicht als Ganzzahl berechnen. Sonst kann es sein, dass bei einem Mittelwert von 5.9 trotzdem die 5 statt der 6 ausgegeben wird.
Die Variable test ist nicht unbedingt nötig -> nicht so viel Speicher verschwenden
In der while-Schleife am Ende (bei der for die bessere Wahl wäre), hast du in if und in else y++, das könnte man also auch rausziehen.
public static int medoid(int[] numbers) {
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
float mittel = (float)sum / numbers.length;
int index = 0;
float minDiff = Math.abs(mittel - numbers[0]);
for (int i = 1; i < numbers.length; i++) {
if (Math.abs(mittel - numbers[i]) < minDiff) {
minDiff = Math.abs(mittel - numbers[0]);
index = i;
}
}
return numbers[index];
}
Wir hatten noch nicht math.abs()
gehts auch anders?
public static int medoid(int[] numbers) {
int sum = 0;
int mittel;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
int [] test = new int[numbers.length];
mittel = sum / numbers.length;
for (int i = 0; i < numbers.length; i++) {
test[i] = mittel - numbers[i];
}
int y = 1;
int i = 0;
while (y < numbers.length) {
if ( test[i] < test[y]) {
y++;
} else {
i = y;
y++;
}
}
return numbers[i];
}
Das Problem:
wenn du eine Zahl hast, die größer als der Mittelwert ist, steht in test an dieser Stelle etwas negatives.
Für dein Beispiel konkret: [7, 10, 6, -28, 1]
Bei dem Vergleich test[i] < test[y] wird also die -28 gefunden, weil das die kleinste Zahl ist.
Du musst also irgendwo den Betrag einbauen, z.B. so: test[i] = Math.abs(mittel - numbers[i]);
Jetzt findet das Programm auch den richtigen Wert.
ein paar Verbesserungsvorschläge:
Den Mittelwert würde ich nicht als Ganzzahl berechnen. Sonst kann es sein, dass bei einem Mittelwert von 5.9 trotzdem die 5 statt der 6 ausgegeben wird.
Die Variable test ist nicht unbedingt nötig -> nicht so viel Speicher verschwenden
In der while-Schleife am Ende (bei der for die bessere Wahl wäre), hast du in if und in else y++, das könnte man also auch rausziehen.
public static int medoid(int[] numbers) {
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
float mittel = (float)sum / numbers.length;
int index = 0;
float minDiff = Math.abs(mittel - numbers[0]);
for (int i = 1; i < numbers.length; i++) {
if (Math.abs(mittel - numbers[i]) < minDiff) {
minDiff = Math.abs(mittel - numbers[i]);
index = i;
}
}
return numbers[index];
}
/**
* Medoid Klasse. Diese Klasse dient zur Berechnung des Medoids einer Menge von
* Zahlen.
*/
public class Medoid {
/**
* Die Methode medoid berechnet den Medoid eines Arrays vom Typ double. Der
* Medoid ist die Zahl, die dem Mittelwert aller Zahlen am nächsten
* liegt.
*
* @param numbers Die Menge von Zahlen, deren Medoid berechnet werden soll.
* @return Gibt den Medoid der Eingabemenge von Zahlen zurück
*/
public static int medoid(int[] numbers) {
int sum;
int mittel;
for (int i =0; i<numbers.length; i++){
sum+=numbers [i];
}
int [] test= new int [numbers.length];
mittel =sum/numbers.length;
for (int i =0; i<numbers.length; i++){
test[i]= mittel-numbers [i];
}
int y=1;
int i=0;
while (y<numbers.length){
if ( test [i] < test [y]){
y=y+1;
} else {
i=y;
y=y+1;
}
}
return numbers [i];
}
}