Java: java.lang.ArrayIndexOutOfBoundsException

georg_willi

Cadet 4th Year
Dabei seit
Juli 2004
Beiträge
110
hi, ich hab ein problem mit meinem javaprogramm. es soll zahlen, die in einem array zufällig generiert werden, mit dem quicksort-algorithmus sortieren. die größe des array soll der benutzer eingeben können. hier das, was ich habe:

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class quick {

	public static void quicksort(int l, int r, int  zahl[])
	{
		int i=l;
		int j=r;
		int merke=0;
		int mitte = zahl[(l+r)/2];
		
		while (zahl[i]<mitte)
		{
			i++;
		}		
		while(mitte <zahl[j])
		{
			j--;
		}		
		if(i<=j)
		{
			merke=zahl[i];
			zahl[i]=zahl[j];
			zahl[j]=merke;
			i++;
			j--;			
		}
	}
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));	
		System.out.println("Bitte geben Sie die Größe des Arrays an!");
		int n= Integer.parseInt(br.readLine());		
	    //int mitte;		
		//int merke;
		//int x=n;
		Random generator= new Random();
		int  zahl[]= new int[n];	
		
		int l=0;
	    int r = zahl.length-1;
	
		for (int a=0; a<n; a++)
		{
			zahl[n]= generator.nextInt(100);
			System.out.println(": "+zahl[a]+a);
		}
	}
}
wenn ich es nun ausführe, bekomme ich folgende fehlermeldung:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at quick.main(quick.java:47)
10 war die zahl, die ich eingegeben habe. zeile 47 steht mein generator.
danke für die hilfe im voraus.:)
 
Zuletzt von einem Moderator bearbeitet: (Bitte den [code]-Tag verwenden!)

solid2005

Lt. Junior Grade
Dabei seit
Apr. 2004
Beiträge
425
Random liefert glaube ich Zahlen von [0;1[.
also musst du den mal 10 nehmen.
und ein Array fängt ja immer bei null an, da musst du auch drauf achten.
 

georg_willi

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juli 2004
Beiträge
110
aber ich hab doch "zahl[n]= generator.nextInt(100);" geschrieben. er sucht also zahlen im bereich bis 100 aus. Vielleicht meinst du ja das richtige, ich habs nur nicht verstanden. erklär es mir bitte, bin noch java-neuling.:(
 

georg_willi

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juli 2004
Beiträge
110
danke! das war ein guter schritt nach vorne. die zahlenreihe, die nun ausgegeben wird, ist aber noch nicht geordnet. das ist mir im unterricht auch öfters passiert und hab mir deswegen rat von meinem lehrer geholt. ich kann mich aber nicht mehr erinnern, was ergesagt hat (ich eben auch nur ein schüler). es waren damals ja auch andere sortier-algorithmen.
 

WingX

Commander
Dabei seit
Juli 2001
Beiträge
2.308
Das liegt daran, dass Quicksort ein rekursiver Algorithmus ist. Du rufst ihn nur einmal auf, dabei kann ja keine Sortierung zustande kommen. Ich hab den Code für Quicksort hier, aber ich weiss nicht, ob du nicht selbst drauf kommen willst.
 

georg_willi

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juli 2004
Beiträge
110
man bin ich dumm. ich muss da noch

if (l<j ) {quicksortl(l,j)}

und
if (i<r ) {quicksortl(l,j)} reinbringen.

rekursiv...ja. es ist ja auch schon spät und gestern war samstag und davor kam freitagabend und ich bin 18:D .
 

georg_willi

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juli 2004
Beiträge
110
ok ...zeig mir bitte mal deinen quelltex. ich hab jetzt versucht die folgenden zeilen einzubringen:
Code:
if (l<j ) {return quicksort(l,j);}
           if (i<r ) {return quicksort(l,j);}
aber ich weiß nicht wie ich es richtig in quicksort reinbringe. quicksort wird immer rot unterstrichen, es wird glaube eine array variable in der klammer verlangt.
 

WingX

Commander
Dabei seit
Juli 2001
Beiträge
2.308
Du musst natürlich deine Methode quicksort wieder mit den richtigen Parametern versorgen,
also zahl muss auch mit rein.
Code:
if (l<j ) {quicksort(l,j, zahl);}
if (i<r ) {quicksort(i,r, zahl);}
 

georg_willi

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juli 2004
Beiträge
110
DANKE nochmal. du hast mir sehr geholfen:).
 

georg_willi

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Juli 2004
Beiträge
110
da es doch ein recht großes interesse gab, habe ich das kleine programm noch etwas ausgeschmückt und eine zeit messung implementiert.
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class quick {	
	public static void quicksort(int zahl[], int l, int r)
	{	
		int i=l;
		int j=r;
		int merke=0;
		int mitte = zahl[(l+r)/2];
				
		do{
			 
			 while (zahl[i] < mitte){ i++;}
			 while (mitte < zahl[j]){j--;}
			 
			 if(i<=j){			 
			 merke = zahl[i];
			 zahl[i] = zahl[j];
			 zahl[j] = merke;
			 i++;
			 j--;
			 }
		}
			 while (!(i> j));
			if (l<j ) { quicksort(zahl,l, j);}
			if (i<r ) { quicksort(zahl,i, r);}
		}			
	public static void printArray(int zahl[]){
		 
		 for(int a = 0; a<zahl.length; a++){
		 System.out.println("array["+a+"]: "+zahl[a]);
		 }
		 }	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));	
		System.out.println("Bitte geben Sie die Größe des Arrays an!");
		int n= Integer.parseInt(br.readLine());		
	 
		Random generator= new Random();
		int  zahl[]= new int[n];	
	      
      
       int r = zahl.length-1; 	
		for (int a=0; a<n; a++)
		{
			zahl[a]= generator.nextInt(10000);
			System.out.println("array["+a+"]: "+zahl[a]);
		}
		 long start = System.currentTimeMillis();
		quicksort(zahl,0,r);
		System.out.println("Und nun sortiert:");
		 long ende = System.currentTimeMillis();
		printArray(zahl);
		
		System.out.println("Sortierzeit : "+(ende-start)+"Millisekunden ");
	}
}
aber nicht wundern, wenn nur kleine zeitwerte gemessen werden bei relativ langer dauer. es braucht wesentlich mehr zeit alles auszugeben als zu berechnen. in der zeile
Code:
zahl[a]= generator.nextInt(100);
kann man den wertebereich des arrays festlegen
viel spaß und einen großen dank an WingX.:cool_alt:
 
Zuletzt bearbeitet:
Top