ArrayIndexOutOfBoundsException

akvarel

Mitglied
Hallo!
Ich muss so was schreiben:
Entwerfen und analysieren Sie Methoden
groesserGleich(int k) zur Bestimmung der Anzahl der Eintrage  A[j] mit
A[j]>=  k
Ich habe es nicht als Methide gemacht, sondern einfach in der main.
Er sagt mit aber den Fehler ArrayIndexOutOfBoundsException. Ich verstehe nicht warum. Ich überschneite doch die Grenze des Arrays nicht.

Vielen Dank

Java:
public class TC {
	 public static void main(String[] args) {
		 
		 int x[][] = {{4,6,7,8}, {0,1,5,9}, {2,9,10,12}, {0,1,14,14}};
		 
		
		 int i=x.length/2;
		 int u=x.length/2;
		 
	int z=0;
	int k=5;
	
	for(int y=0;y<x.length;y++){
		if(x[y][i]<k){
			for(i+=1;i<x.length;i++){
				if(x[y][i]>=k){
					z++;
				}
				
			}			
		}
		else if(x[y][i]>=k){
			while(u<x.length){
				z++;
				u++;}
			for(i-=i;i>0;i--){
				if(x[y][i]>=k){
					z++;
				}
			
			}
		}
		
		
	}
	
	 System.out.println(z);}}
 
Genaue Fehlermeldung posten. Da steht die Zeile dabei in der das auftritt.

Ich überschneite doch die Grenze des Arrays nicht.
Offensichtlich doch. Die JVM lügt nicht 😉

Ich habe es nicht als Methide gemacht, sondern einfach in der main.
Warum?

...Was sollst du machen? Herausfinden wieviele Einträge im Array >= k sind? Oder versteh ich die Aufgabenstellung nicht. Denn wenn das so ist, dann machst du es eindeutig viel zu kompliziert. Das sind 3 Zeilen Code.
 
Zuletzt bearbeitet:
Du willst rausfinden wieviele Einträge >= k sind aber nicht jeden Eintrag mit k vergleichen? Wie soll das denn funktionieren? 😉
 
Wenn du herausfinden willst, welche Einträge >= k sind, dann musst du sie mit k vergleichen^^.
Und das geht nun mal "linear" am schnellsten und am saubersten.
Einfach durch das Array iterieren und nen Treffercounter hochzählen.
Ergebnis ausgeben und fertsch.

Gruß Vanny

Wenn man vom 2. in den 4. Stock will, kann man mit dem Fahrstuhl fahren.
Man kann aber auch warten bis der Fahrstuhl im 1. Stock hält, die Türen zum Schacht aufbrechen und versuchen, am Seil nach oben zu klettern in der Hoffnung, nicht vorher vom hochfahrenden Fahrstuhl gekillt zu werden 😳

Sry cnr
 
Zuletzt bearbeitet von einem Moderator:
Dass das Array sortiert vorliegt hättest du uns sagen müssen. Ja, man könnte sich das an dem Beispiel-Array in deinem Code denken, aber davon steht nix in der Aufgabenstellung.

edit: Wie gesagt, mach mal etwas genauere Angaben zum Fehler. ZEILE! Ist doch unnötig dass wir uns den ganzen Code da durchüberlegen müssen, nur weil du uns (noch) eine Information enthälst.
 
Wenn man vom 2. in den 4. Stock will, kann man mit dem Fahrstuhl fahren.
man kann auch im 3. stock anhalten und warten bis die türen zugehen und dann in den 4. stock fahren. und das ist linear.

oder ich kann direkt vom 2. in den 4. stock fahren, ohne anzuhalten. das ist schon nciht linear
 
Fang doch erstmal an und setz dir Sysouts rein (oder debuggen) und schau warum welche Variable zu groß wird. Oder suchst du jetzt ne fertige Lösung?

Ich würde den Code aber zunächst mal etwas strukturieren. Du kannst zumindest eine Methode schreiben die dir aus nem sortierten int[] Array die Anzahl der Werte >= k zurückgibt. Die kannst du dann für jedes int[] in deinem int[][] aufrufen.
 
Kommt deswegen zu Stande weil du in der inneren for-Schleife an diesem i rumschraubst:

Code:
for(i+=1;i<x.length;i++)

Das i+=1 ist das Problem. Das ist ein Seiteneffekt der IMMER ausgeführt wird. Da hilft dir das i<x.length dahinter auch nix mehr. Zwar wird die innere Schleife nicht betreten aber auch die äußere nutzt das i. Und das ist schon von Anfang an 2, und du zählst es 4 mal hoch. Wäre also 6, aber davor kracht's schon weil keines der inneren Arrays hat length = 7.

Ich glaub übrigens dass du da ein paar Denkfehler drin hast. Warum initialisiert du i mit x.length/2? i nutzt du für den Zugriff am zweiten Index, d.h. auf die einzelnen Arrays. Und wie groß die einzelnen Arrays sind das lässt sich nicht über x.length sagen. Es sei denn es gelten noch weitere totgeschweigte Eigenschaften für das Array..
 
Zuletzt bearbeitet:
Das i+=1 ist das Problem. Das ist ein Seiteneffekt der IMMER ausgeführt wird.
Ok. ich konnte es in sowas umwandeln
Java:
for(i=(x.length/2)+1;i<x.length;i++){
aber zeigt mir denselben fehler

i nutzt du für den Zugriff am zweiten Index, d.h. auf die einzelnen Arrays. Und wie groß die einzelnen Arrays sind das lässt sich nicht über x.length sagen
ich habe eine quadratische Matrix. also ich kann durch x.length auch die länge einzelnen arrays bestimmen.(entschuldigung, das habe ich auch nicht gesagt)
 
Es ist nicht so dolle die Zählvariable einer Schleife innerhalb einer anderen Schleife zu verändern. Das führt zu einer schwer nachvollziehbaren Schleifenlogik. Mach dir für die innere Schleife eine neue Variable, die kannst du ja mit i oder i+1 oder was auch immer initialisieren. Aber verändere nicht i selbst.

Was ist eigentlich dein Gedankengang? Kannst du deinen Code mal umgangssprachlich ausformulieren? Wir müssen erstmal rausfinden ob du einen Fehler im Ansatz hast oder einen Fehler in der Umsetzung.
 
ok. also.
für ein einzelnes array vergleiche ich k mit dem element, der in der mitte steht.

wenn k grösser ist, dann mitte+1 und ich such nach der bedienung eintrag>=k, wenn ich den gefunden habe dann z=z+1(z ist die Anzahl der elementen,dir grösser gleich k sind), und das wird bis zum ende des arrays gemacht.
Java:
if(x[y][i]<k){
			for(i=(x.length/2)+1;i<x.length;i++){
				if(x[y][i]>=k){
					z++;
				}
				
			}
wenn aber k kleiner oder gleich als eintrag in der mitte ist, dann zähle ich zuerst z hoch für jeden eintrag bis zum ende des arrays(weil da auf jeden fall grössere einträge stehen).
Java:
else if(x[y][i]>=k){
			while(u<x.length){
				z++;
				u++;}
und dann muss ich noch rausfinden, wie viele einträge vor der mitte grösser gleich k sind. also, ich zähle mitte-1, und wenn die Bedienung erfüllt ist,dann wieder z++, und so bis zum arraysende.

Java:
for(i=(x.length/2)-1;i>0;i--){
				if(x[y][i]>=k){
					z++;
				}
 
Das ist aber auch keine richtige binäre Suche 😉
Du schaust ja nur ganz am Anfang einmal in der Mitte nach ob du dich nach links oder rechts orientieren musst. Dann kannst du das ganze auch direkt linear durchgehen, viel langsamer wirds dann auch nicht sein 😉

Du musst übrigens auch nicht jeden Eintrag zählen, es reicht wenn du die Stelle i gefunden hast wo gilt x < k und x[i+1] >= k. Wenn du die Stelle gefunden hast kannst du direkt sagen wieviele Einträge in deinem Array >= k sind. Da das Array sortiert ist muss jeder Eintrag rechts von x[i+1] auch immer >= k sein.

Konzentrier dich also erstmal darauf die Stelle i zu finden. Das kannst du ganz gut mit binärer Suche machen.
 
Die Variable i wird global gesetzt und irgendwann 4, dadurch knallt die Abfrage if(x[y]>=k)...
Sitze an der Arbeit und weiß somit nicht genau, was an dem Rest zu ändern wäre, aber ich denke, Du musst die Variable an einer Stelle zurücksetzen.
 

Zurück
Oben