Geschrieben von eulerscheZahl am 16.12.2014 um 08:07:
erst mal in eine leserliche Form bringen und die Variable sum initialisieren:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
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.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
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];
} |
|
Geschrieben von neuling96 am 16.12.2014 um 16:47:
| 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.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
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?
müsste statt der null nicht i stehen?
if (Math.abs(mittel - numbers[i]) < minDiff) {
minDiff = Math.abs(mittel - numbers[i]);