Java Rat für absoluten Java Neuling

Dr.Kaya

Cadet 2nd Year
Dabei seit
Nov. 2010
Beiträge
19
Hey,

und zwar sollen wir ein "Programm" schreiben dass die Werte eine Feldes in zwei weitere
Felder sortiert und danach ausgibt.
Einmal Werte größer als der Durchschnitt und einmal Werte kleiner als der Durchschnitt.
Auch soll nach jedem Wert eine Leerstelle kommen, außer nach dem Letzten, hier soll es ein Zeilenumbruch sein.

Nun hier was ich mir dazu überlegt habe:
Code:
int laengegr = 0;
		int laengekl = 0;
		for (int i=0 ; i<feld.length ; i++){
				laengegr = laengegr++;	
			}else{
				laengekl = laengekl++;
			}
		}

		int []feldgr;
		int []feldkl;
		feldgr = new int[laengegr];

System.out.print("Die Werte größer als der Durchschnitt sind: ");
		
		for (int i=0, j=0; i<feld.length ; i++){
			if(feld[i]>=durchschnitt){
				feldgr[j]=feld[i];
				if(j+1!=feldgr.length){
					System.out.println(feldgr[j]);
				}else{

					System.out.print(feldgr[j]+ " ");
				}
				j=j++;
			}
		}
	
		System.out.print("Die Werte kleiner als der Durchschnitt sind: ");
			
		for (int i=0, j=0; i < feld.length ; i++){
			if(feld[i]<durchschnitt){	
				feldkl[j] = feld[i];					
				if(j+1!=feldkl.length){		
					System.out.println(feldkl[j]);
				}else{
					System.out.print(feldkl[j]+ " ");
				}
				j=j++;
			}	
		}

als Fehler bekomme ich das hier:
Code:
Die Werte größer als der Durchschnitt sind: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at Felder.main(Felder.java:71)

ich hoffe ihr habt ne idee, ich finde den Fehler nämlich einfach nicht.

Grüße Kaya
 

Tim69

Cadet 3rd Year
Dabei seit
Nov. 2008
Beiträge
35
Gib mal die Zeilennummern mit an, das wäre hilfreich. Du greifst irgendwo auf ein Array zu, das Länge 0 hat. Deswegen auch die java.lang.ArrayIndexOutOfBoundsException: 0 (Stelle 0 existiert nicht).
 

Dr.Kaya

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
19
ah ok,

also wenn ich auf die Fehlermeldung klicke, bringt er mich zu der Stelle

Code:
				feldgr[j]=feld[i];
 

Mika911

Captain
Dabei seit
Juni 2007
Beiträge
3.329
Ich sehe nicht, das du je das Array feldkl initialisierst.
Weiterhin willst du eine Fallunterscheidung machen auf feld.length und feld finde ich nirgens.
Nur feldgr und feldkl gibt es.
 
Zuletzt bearbeitet:

Tim69

Cadet 3rd Year
Dabei seit
Nov. 2008
Beiträge
35
Du kannst vor "feldgr[j]=feld;" mal schreiben

Code:
System.out.println("Länge von feldgr: " + feldgr.length + " Länge von feld: " + feld.length + " Länge von feldkl: " + feldkl.length);
Dann siehst du welches Array Länge 0 hat und deswegen auch kein Element am index 0 hat.

Und du könntest auch mal die komplette Methode angeben, das was hier zu lesen ist sieht nach einzelnen unvollständigen Fragmenten aus.
 

Dr.Kaya

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
19
Ja das war auch nur ein Ausschnitt, der Rest davor und danach funktioniert soweit.
Aber hier nun mal das ganze ding:
Code:
public class Felder {
	
	public static void main(String[] args) {
		
		int[] feld = { 3, 7, 11, 13, 2, 4, 6, 8, 10, 12};
		
		System.out.print("Die Werte sind: ");
		
		for (int i = 0; i < feld.length;i++) {
			
			if(i<feld.length-1){
				System.out.print(feld[i] + " ");
			}else{
				System.out.println(feld[i]);
				}
			}
		int maximum = feld[0];Feldes sowohl
		int minimum = feld[0];
		for (int i=0 ; i<feld.length ; i++) {
			if(maximum<feld[i]){
				maximum = feld[i];
				}
			if(minimum>feld[i]){
				minimum = feld[i];
				}
			}
		System.out.println("Der Maximalwert beträgt: "+maximum);
		System.out.println("Der Minimalwert beträgt: "+minimum);
		
		double summe = 0;
		
		for (int i=0 ; i<feld.length ; i++) {
			summe=summe+feld[i];
			}

		double durchschnitt =summe/feld.length;
		
		System.out.println("Der Durchschnittswert beträgt: "+durchschnitt);
		
		int laengegr = 0;
		int laengekl = 0;

		for (int i=0 ; i<feld.length ; i++){

			if (feld[i]>=durchschnitt){
				laengegr = laengegr++;
			}else{
				laengekl = laengekl++;
			}
		}	
		
		int []feldgr;
		int []feldkl;
		feldgr = new int[laengegr];
		feldkl = new int[laengekl];
		
		System.out.print("Die Werte größer als der Durchschnitt sind: ");
		
		for (int i=0, j=0; i<feld.length ; i++){
			if(feld[i]>=durchschnitt){
				feldgr[j]=feld[i];
				if(j+1!=feldgr.length){
					System.out.println(feldgr[j]);
				}else{
					System.out.print(feldgr[j]+ " ");
				}
				j=j++;
			}
			
		}
	
		System.out.print("Die Werte kleiner als der Durchschnitt sind: ");
			
		for (int i=0, j=0; i < feld.length ; i++){
			if(feld[i]<durchschnitt){
				feldkl[j] = feld[i];
				if(j+1!=feldkl.length){
					System.out.println(feldkl[j]);
				}else{
					System.out.print(feldkl[j]+ " ");
				}
				j=j++;
			}
	
		}
	
		System.out.print("Jeder zweite Wert: ");
		
		int laengedrei = feld.length/2;
		int [] drei;	
		drei= new int [laengedrei];

		for (int i=1, j=1; i < feld.length;i++,i++) {
			drei[j] = feld[i];
			j=j++;
			System.out.print(drei[j]+ " ");
			
		}
	}	
		
}
 

jenskreidler

Cadet 4th Year
Dabei seit
März 2006
Beiträge
72
Code:
import java.util.Arrays;

import junit.framework.TestCase;

public class ArraySort_Test extends TestCase {

    private int[] values;

    @Override
    protected void setUp() throws Exception {
        int NUM_OF_VALUES = 10;
        values = new int[ NUM_OF_VALUES ];
        for( int i = 0; i < NUM_OF_VALUES; i++ ) {
            values[ i ] = (int)( Math.random() * 100 );
        }
    }

    public void testOutputInTwoArrays() {
        // values aufsteigend sortieren lassen
        Arrays.sort( values );

        // Durchschnittswert errmitteln
        int sum = 0;
        for( int i = 0; i < values.length; i++ ) {
            sum += values[ i ];
        }
        int average = sum / values.length;
        System.out.println( "Durchschnitt = " + average );

        // die ausgabe - arrays erstellen
        int half = getIndexOfAverage( average, values );
        int lowerSize = half;
        int upperSize = values.length - half;
        int[] array1 = new int[ lowerSize ];
        int[] array2 = new int[ upperSize ];
        int fillIndex1 = 0;
        int fillIndex2 = 0;
        for( int i = 0; i < values.length; i++ ) {
            int value = values[ i ];
            if( value <= average ) {
                array1[ fillIndex1++ ] = value;
            }
            else {
                array2[ fillIndex2++ ] = value;
            }
        }
        // Ausgabe wie gewünscht
        System.out.println( "Kleiner als Durchschnitt:" );
        for( int i = 0; i < array1.length; i++ ) {
            System.out.println( array1[ i ] );
        }
        System.out.println( "Größer als Durchschnitt:" );
        for( int i = 0; i < array2.length; i++ ) {
            System.out.println( array2[ i ] );
        }
    }

    private int getIndexOfAverage( int average, int[] values ) {
        int index = 0;
        for( int value : values ) {
            if( value <= average ) {
                index++;
            }
            else {
                break;
            }
        }
        return index;
    }

}
 

Tim69

Cadet 3rd Year
Dabei seit
Nov. 2008
Beiträge
35
laengegr = laengegr++;

Was denkst du was das macht? Dass es laengegr um 1 erhöht? Falsch!
Es erstellt einen neuen int, schreibt den Wert von laengegr rein und erhöht den alten int, in dem laengegr vorher stand. Deswegen bleibt deine Variable immer 0.

Du kannst ein preincrement benutzen: laengegr = ++laengegr;
oder du nimmst schönerweise die Kurzform: laengegr++;
das tut was du brauchst.

@jenskreidler: Bringt ihm ja nichts wenn du programmieren kannst.
 

leimer

Cadet 2nd Year
Dabei seit
Jan. 2006
Beiträge
28
Ihr scheint ja alle echt Bock auf elendiges Arraygefummel zu haben... gleich ne variable Liste nehmen und gut is: Umsetzung mit java.util.ArrayList<Integer>

Code:
import java.util.ArrayList;
//Achtung! feld muss mindestens 1 Element haben!

//Durchschnitt, Maximum und Minimum ermitteln
double summe = 0;
int maximum = Integer.MIN_VALUE;
int minimum = Integer.MAX_VALUE;
for (int i=0; i<feld.length; i++) {
	int wert = feld[i];
	maximum = Math.max(maximum, wert);
	minimum = Math.min(minimum, wert);
	summe = summe + wert;
}
double durchschnitt = summe / feld.length;

//Feld in zwei Listen "sortieren"
ArrayList<Integer> kleinerList = new ArrayList(feld.length); //Liste mit kleineren Werten als Durchschnitt
ArrayList<Integer> groesserList = new ArrayList(feld.length); //Liste mit größeren/gleichen Werte als Durchschnitt
for (int i=0; i<feld.length; i++) {
	int wert = feld[i];
	if (wert>=durchschnitt) {
		groesserList.add(wert);
	} else {
		kleinerList.add(wert);
	}
}
// die zwei Listen in Array umwandeln
Integer []feldgr = kleinerList.toArray();
Integer []feldkl = groesserList.toArray();

//TODO Nun noch die gewünschte Ausgabe: feldgr und feldkl ausgeben...
 

Dr.Kaya

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
19
Ja dachte eigentlich schon dass das den Wert um 1 erhöht...
so kann man sich irren ^^

Lists kenn ich noch nicht, das kommt bestimmt in einer später Vorlesung

Vielen Danke für die schnellen hilfreichen Antworten
 

kuddlmuddl

Commander
Dabei seit
Mai 2010
Beiträge
2.495
um ne var um 1 zu erhöhen schreibst du entweder lang:
laengegr = laengegr + 1;

oder kurz:
laengegr++;

ne mischung von beidem ist von programmieranfängern meist ungewollt ;)
 

jenskreidler

Cadet 4th Year
Dabei seit
März 2006
Beiträge
72
jou mir hats auch in den Fingern gejuckt, bin dann aber von List abgegangen weil seine Aufgabenstellung mit arrays zu tun hatte.

Ok, es hilft ihm weniger, aber so sieht er vielleicht andere Ansätze und kann sich mit unit tests+debugger vertraut machen ... so als denkanstoß für testgetriebene Entwicklung.
 

Dr.Kaya

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
19
Mh nun gehts weiter,
eigentlich sollte der letzte Werte immer mit einem Zeilenumbruch ausgegeben werden:
Code:
System.out.print("Die Werte größer als der Durchschnitt sind: ");
		
		for (int i=0, j=0; i<feld.length ; i++){
			if(feld[i]>=durchschnitt){
				feldgr[j]=feld[i];
				if(j+1!=feldgr.length){
					System.out.print(feldgr[j]+ " ");
				}else{
					System.out.println(feldgr[j]);
				}
				j=j++;
			}
			
		}
	
		System.out.print("Die Werte kleiner als der Durchschnitt sind: ");
			
		for (int i=0, j=0; i < feld.length ; i++){
			if(feld[i]<durchschnitt){
				feldkl[j] = feld[i];
				if(j+1!=feldkl.length){
					System.out.print(feldkl[j]+ " ");
				}else{
					System.out.println(feldkl[j]);
				}
				j=j++;
			}
	
		}
	
		System.out.print("Jeder zweite Wert: ");
aber es kommt immer nur so raus:
Code:
Die Werte größer als der Durchschnitt sind: 11 13 8 10 12 Die Werte kleiner als der Durchschnitt sind: 3 7 2 4 6 Jeder zweite Wert: 7 13 4 8 12
also alles in einer Zeile...
hab schon ein paar sachen probiert aber egal was ich änder er spuckt es immer so aus,
was ist daran denn so falsch ?

Grüße Kaya
 
Zuletzt bearbeitet:

Dr.Kaya

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
19
Ja von der Aufgabenstellung her sollte es am Ende so aussehen:
Code:
Die Werte größer als der Durchschnitt sind: 11 13 8 10 12
Die Werte kleiner als der Durchschnitt sind: 3 7 2 4 6
ich frage mit dem zweitem if ab ob das schon der letzte Wert ist, wenn ja soll er einen
Zeilenumbruch machen und andernfalls einfach nur mit einem Leerzeichen weiter machen.
Zumindest soweit in der Theorie :D
 

Soultaker

Ensign
Dabei seit
Aug. 2004
Beiträge
169
Code:
System.out.print("Die Werte kleiner als der Durchschnitt sind: ");
Durch System.out.println() ersetzen.
Ich glaub du verstehst System.out.println() falsch, es macht nicht am Ende einer Zeile einen Umbruch sonderen am Anfang

ich frage mit dem zweitem if ab ob das schon der letzte Wert ist, wenn ja soll er einen
Zeilenumbruch machen und andernfalls einfach nur mit einem Leerzeichen weiter machen.
Zumindest soweit in der Theorie
Das ist gar nicht nötig
 

Dr.Kaya

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
19
wenn ich das mache kommt das hier raus:
Code:
Die Werte größer als der Durchschnitt sind: 
11 13 8 10 12 Die Werte kleiner als der Durchschnitt sind: 
3 7 2 4 6
also gelöst hab ich es nun indem ich "\n"+ dazu geschrieben habe,
aber ich verstehe trotdem nicht warum mein Ansatz nicht funktioniert,
kann mir das jemand erklären ?

Grüße Kaya
 
Zuletzt bearbeitet:
Top