Methoden Vertauschen von 2 Werten eines Arrays

xyt4n

Aktives Mitglied
Guten Tag,

ich muss innerhalb 1-2 Wochen mir einige Java Grundlagen für den Anfang des Studiums aneignen.
Nun meine aktuelle Aufgabe ist 2 Werte von Arrays durch eine Methode zu vertauschen. Die Methode habe ich swap genannt. Ich habe 2 Fehlermeldungen, die ich mit Kommentaren markiert habe. Ich komme seit Stunden nicht mehr weiter,d eshalb wende ich mich mal an das Forum hier.

Bitte so einfach wie möglich erklären, wenn ich was grundlegendes falsch mache, da ich Java seit ca 5 Tagen kenn und es für mich z.Z. sehr schwer fällt neue Sachen in Java zu lernen.

Alles was vor Zeile 23 kommt ist in der Form richtig.

Java:
import java.util.Scanner;
class Array {
	public static void main (String args[]){

		int n, a, k, j;
		String wort;
		a=0;
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		int zahl[]= new int[n];
		
		System.out.println("Index\tWert");
		
		for (int i=0; i<n; i++)
		{zahl[i]=n-a; a++;}

		Array.printArray(zahl);

		System.out.println("Wollen sie 2 Werte vertauschen?");
		System.out.println("j/n");
		wort=sc.nextLine();

		if (wort=="j"){	
		System.out.println("Geben sie den ersten Index ein");
		k=sc.nextInt();
		System.out.println("Geben sie den zweiten Index ein");
		j=sc.nextInt();}
		
		Array.swap(zahl, k, j); //Fehlermeldung
		Array.printArray(zahl);
		}

			public static void printArray(int[] zahl){
			
			int i;
			for (i=0; i<zahl.length; i++)
			{System.out.println(i+"\t"+zahl[i]);}
}



		public static swap(int[] zahl, int k, int j){ //Fehlermeldung
			int x, y; 
			
			zahl[k]=x;
			zahl[j]=y;
			x=x+y;
			y=x-y;
			x=x-y;
			return zahl[k]=x;
			return zahl[j]=y;
			
			
		}
}
 
In deiner swap Methode ist kein Rückgabeltyp angegeben.
Man kann außerdem immer nur einen Wert zurückgeben.


Und schau dir nochmal an wie man Strings vergleicht.
 
In deiner swap Methode ist kein Rückgabeltyp angegeben.
Man kann außerdem immer nur einen Wert zurückgeben.


Und schau dir nochmal an wie man Strings vergleicht.

Okay, ich habe jetzt das hier geschrieben:

String ja;
ja="j";

if (wort==ja😉....

Es wäre ziemlich blöd, wenn man nur einen Wert rückgeben kann. Ich brauche ja eine Methode die 2 Werte vertauscht und dies dann im Array auch speichert. Wie kann ich denn diese Begrenzung umgehen?
Und wieso fehlt ein Rückgabetyp? Ich habe doch jeweils die Werte und den Datentyp in die Klammer hineingeschrieben.
 
Java:
String ja; 
ja="j";

if (wort==ja;)....
Nein, das ist praktisch identisch mit dem was du vorher stehen hattest und macht keinen Unterschied.

Es wäre ziemlich blöd, wenn man nur einen Wert rückgeben kann. Ich brauche ja eine Methode die 2 Werte vertauscht und dies dann im Array auch speichert. Wie kann ich denn diese Begrenzung umgehen?

Wenn du mehrere Werte zurückgeben willst kann man z.B ein Array nutzen das mehrere Werte enthält

Und wieso fehlt ein Rückgabetyp? Ich habe doch jeweils die Werte und den Datentyp in die Klammer hineingeschrieben.

Der Rückgabetyp steht vor der Methodenbezeichnung. Was du hier beschreibst sind die Parameter der Methode.
 
Deine Methode ist falsch.

1. muss es
Code:
public static void
heißen wie FinalStriker bereits erwähnte,
2. Du musst in dieser Methode nichts zurückgeben, Arrays sind Objekte und wenn du Werte in diesem Array veränderst, dann wirkt sich das direkt auf das Ursprungsarray aus.
3. Du solltest wirklich grundlegende Grundlagen aneignen: Du deklarierst ein Feld und weist einem anderen Feld den Wert dieses Feldes zu, dabei hast du diesem Feld noch nichts zugewiesen.
Java:
int x, y;

array[k] = x; // x ist noch nicht deklariert
array[j] = y; // y ebenfalls!!!
 
Okay, danke! Ich hab jetzt geschafft das Programm auszuführen und es funktioniert auch fast. Das fast bezieht sich darauf, dass ich nur einmal was in der Konsole schreiben kann und nicht mehrmals.
Woran könnte das liegen? Das Problem tritt ab Zeile 21 auf.

Hier nochmal das bearbeitete Programm:

Java:
import java.util.Scanner;
class Array {
	public static void main (String args[]){

		int n, a;
		String wort;
		a=0;
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		int zahl[]= new int[n];
		
		System.out.println("Index\tWert");
		
		for (int i=0; i<n; i++)
		{zahl[i]=n-a; a++;}

		Array.printArray(zahl);

		System.out.println("Wollen sie 2 Werte vertauschen?");
		System.out.println("j/n");
		wort=sc.nextLine();
		if (wort.equals("j")){
		Array.swap(zahl);
		Array.printArray(zahl);}
		}

			public static void printArray(int[] zahl){
			
			int i;
			for (i=0; i<zahl.length; i++)
			{System.out.println(i+"\t"+zahl[i]);}
}

		public static void swap(int[] zahl){
			int x, y, k, j;
			
			Scanner sc = new Scanner(System.in);
			System.out.println("Geben sie den ersten Index ein");
			k=sc.nextInt();
			System.out.println("Geben sie den zweiten Index ein");
			j=sc.nextInt();
			
			x=zahl[k];
            y=zahl[j];
            x=x+y;
            y=x-y;
            x=x-y;
            zahl[k]=x;
            zahl[j]=y;
			
		}
}
 
Funktioniert bei mir (
Code:
sc.nextLine();
vergessen):

Java:
import java.util.Scanner;

/**
 * @author hüte
 */
public class ArrayAction {

    public static void main(String args[]) {
        int n, a;
        String wort;
        a = 0;
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        sc.nextLine();
        int zahl[] = new int[n];

        System.out.println("Index\tWert");

        for (int i = 0; i < n; i++) {
            zahl[i] = n - a;
            a++;
        }

        printArray(zahl);

        do {
            System.out.println("Wollen sie 2 Werte vertauschen?");
            System.out.println("j/n");
            wort = sc.nextLine();
            if (wort.equals("j")) {
                swap(zahl);
                printArray(zahl);
            } else {
                break;
            }
        } while (true);
    }

    public static void printArray(int[] zahl) {
        for (int i = 0; i < zahl.length; i++) {
            System.out.println(i + "\t" + zahl[i]);
        }
    }

    public static void swap(int[] zahl) {
        int x, y, k, j;

        Scanner sc = new Scanner(System.in);
        System.out.println("Geben sie den ersten Index ein");
        k = sc.nextInt();
        System.out.println("Geben sie den zweiten Index ein");
        j = sc.nextInt();

        x = zahl[k];
        y = zahl[j];
        x = x + y;
        y = x - y;
        x = x - y;
        zahl[k] = x;
        zahl[j] = y;
    }
}
 
Warum soll sich das Programm von selbst wiederholen? Wenn du Codeabschnitte wiederholen willst, dann musst du Schleifen benutzen.

Du verstehst mich falsch. Ich brauch keine Schleifen.


Es geht darum das ich was ingeben möchte und er soll reagieren. Danach soll ich wieder etwas eingeben können und er soll reagieren.

Ich kann aber nur einmal was eingeben. Das ist das Problem.

Edit: Vielen Dank hüteüberhüte!
 
Zuletzt bearbeitet:
Wenn die Eingabe ein int ist und danach Enter gedrückt wird, muss zusätzlich
Code:
sc.nextLine();
aufgerufen werden
 
Wenn die Eingabe ein int ist und danach Enter gedrückt wird, muss zusätzlich
Code:
sc.nextLine();
aufgerufen werden

Und wieso klappt das auch hier ohne dem Befehl:

Java:
System.out.println("Geben sie den ersten Index ein");
			k=sc.nextInt();
			System.out.println("Geben sie den zweiten Index ein");
			j=sc.nextInt();
 
(5\n + nextInt) + nextLine = "" (im Buffer steht 5\n)

(5\n + nextInt) + (4\n + nextInt) = 4 (im Buffer steht 5\n4\n)

Blöd zu erklären, nimm lieber BufferedReader + Integer.parseInt(String s)

[EDIT]Danke für das Danke :toll: [/EDIT]
 
(5\n + nextInt) + nextLine = "" (im Buffer steht 5\n)

(5\n + nextInt) + (4\n + nextInt) = 4 (im Buffer steht 5\n4\n)

Blöd zu erklären, nimm lieber BufferedReader + Integer.parseInt(String s)

[EDIT]Danke für das Danke :toll: [/EDIT]

Ich finde diese Konsolenanwendungen wirklich... naja.
Die static Methoden von JOptionPane bieten wirklich so viele Sachen, dass man gänzlich auf System.in verzichten kann.
Also ich sehe keinen Grund, nicht JOptionPane.showInputDialog("Index 1"); statt
Code:
System.out.print("Index 1: "); read(System.in);
zu machen
 
Gerade für den Anfang ist das Arbeiten mit Streams wichtig. JOptionPane ist eher ein Mogelpackung. Bevor man sie benutzt, sollte man mit Streams vertraut sein. Am besten ist es, wenn man mit BufferedReader beginnt
 

Zurück
Oben