# index berechnen



## tyr700 (5. Dez 2011)

Hallo!
ich habe folgende Aufgabe, ich kriege einen Array übergeben und soll den kleinsten Index der Zahl zurückgeben, die am nächsten am arithmetischen Mittel ist. Falls der String leer ist, soll eine IllegalArgumentException geworfen werden.

Mein Problem ist, dass meine Methode bei mehreren gleichen weitentfernten Einträgen, den falschen Index zurück ist. Aber ich versteh nicht wieso! Weil ich ja " <" und nicht "<=" beim Vergleich habe...
Hier auf jeden Fall, was ich geschrieben habe, vielleicht seid ihr ja schlauer! Vielen Dank schonmal für HIlfe!!

```
public int getSmallestIndexNearToAverage (int[]array) throws IllegalArgumentException{
int b= array.length;
int sum=0;
int a=0;
if(b==0){
throw new IllegalArgumentException(" Array ist leer.");
}
while (a<b){
sum= sum + array[a];
a++;
}
a=0;
int c= sum/b;
int d=0;
int e=Integer.MAX_VALUE;
int f=0;
while (a<b){
d = Math.abs(c-array[a]);
if ( d<e){
e=d;
f=a;
}
a++;
}
return f;
}
```


----------



## SlaterB (5. Dez 2011)

bloß kein Test-Array dazu posten..

du verwendest  Math.abs(), damit ist es egal ob eine Zahl größer oder kleiner als die Vergleichszahl ist, d ist immer positiv


----------



## tyr700 (5. Dez 2011)

Aber das muss ich doch, weil ich ja nicht weiss, was ich für einen Durchschnitt berechne. Der könnte ja auch negativ sein. Es geht ja nur um den Abstand von beiden...


----------



## SlaterB (5. Dez 2011)

du siehst doch ein, dass bei einem Mittel von 7 die Zahl 6 einen Abs-Abstand von 1 hat und 8 genauso 1? 
das ist doch gerade dein Problem, Abs ist falsch,
ohne Abs wird es besser, im negativen Bereich sollte es genauso gehen, ansonsten halt mit else anders behandeln,

nenne konkrete Beispeile wo du Probleme hast, 
ich denke ich habe dir deutlich (mit Beispiel) gezeigt dass Abs genau falsch ist


----------



## tyr700 (5. Dez 2011)

okay also ich habe Math.abs jetzt weggemacht.
aber als bsp wenn man [1, 3, 5, 8]  eingibt, ist der durschschnitt ja 4,25.  Also müsste der Index 2 zurückgegeben werden, aber ich kriege 3 zurück.

und wenn man [1, 2, 5, 4, 6, 3] eingibt, dann ist der durchschnitt 3,5 also müsste als index 3 sein, (also 3 oder 5 aber 3 ist ja kleiner) aber ich kriege 4 zurück.
...


----------



## SlaterB (5. Dez 2011)

ohne neuen Code weiß ich nicht auf welche Weise du nun den Index bestimmst, so gehts ja nun doch auch nicht 

4,25 bekommst du kaum als Durchschnitt, der wurde bisher doch in einer int-Variablen gespeichert, also gerundet


----------



## Andi_CH (6. Dez 2011)

Dein Code ist zum kot ... äh - subotimal formatiert, enthält suboptimale Variablennamen und suboptimale Konstrukte ....

IMO Macht dein Code genau das was er soll! Er sucht sich von unten durch den Array und prüft ob die Differenz kleiner ist als die schon gefunden - wenn ja wird der index in result gespeichert und am schluss zurückgegeben.

Falls du meinst da sei etwas falsch liefere einen Testarray und sag was du für ein Resultat erwartest ...

Ob int der Richtige Typ für den Durchschnitt ist bezweifel ich übrigens - ich habe deinen Code nicht verändert, nur die Kosmetik verbessert.


```
public static int getSmallestIndexNearToAverage (int[]array) throws IllegalArgumentException{
		int nrValues = array.length;
		int sum = 0;
		if(nrValues==0){
			throw new IllegalArgumentException(" Array ist leer.");
		}
		for (int i=0; i<nrValues; i++)
		{
			sum += array[i];
		}
		int average = sum / nrValues;
		int minDiff = Integer.MAX_VALUE;
		int result = 0;
		for (int i=0; i<nrValues; i++) {
			int diff = Math.abs(average-array[i]);
			if ( diff < minDiff){
				minDiff = diff;
				result = i;
			}
		}
		return result;
	}
```


----------

