Java Int-Array, kennt sich jemand aus?

Hallo. Ich bin gerade dabei, mir Java anzueignen. Dabei komme ich gerade leider nicht weiter.

Kann mir jemand helfen?

Mein Code bisher:

public class EvenNumbersFirst {

    public static void main(String[] args) {

        EvenNumbersFirst enf = new EvenNumbersFirst();

        int[] numbers = {3, 2, 1, 9, 6, 5, 4, 7, 8};
        int[] result = enf.evenNumbersFirst(numbers);

        System.out.println("Als Parameter übergeben:");

        for (int i : numbers) System.out.print(i + " ");

        System.out.println("\nRückgabe:");

        for (int i : result) System.out.print(i + " ");
    }

    public int[] evenNumbersFirst(int[] input) {
        return input;
    }

}

Nun wollte ich bei „public int[] evenNumbersFirst(int[] input)“ festlegen, dass die oben eingegebenen Zahlen in anderer Reihenfolge ausgegeben werden. ERST die geraden Zahlen, DANN die ungeraden Zahlen. Ist das mit meinem Ansatz möglich?

Es sollte also 2, 6, 4, 8, 7, 5, 9, 1, 3 ausgegeben werden.

Danke im Voraus! :slight_smile:

1 „Gefällt mir“

Ja ist es. Dein Ansatz bisher ist schonmal sehr gut. Deine Logik ist sauber getrennt von der Präsentation. Das solltest du auch weiterhin genau so beibehalten.

Was jetzt halt noch fehlt ist ein konkreter Ansatz für dein Problem. eventNumberFirst muss jetzt halt das input-array sortieren - oder besser noch: eine sortierte Kopie davon zurückgeben.

Schließe mich dem an, das Anfangskonstrukt sieht sehr gut aus. Fehlt nur noch der zweidrittel wichtige Teil. :smiley:

Ich schließe mich den Vorrednern an; aber sicher, dass nicht [2, 6, 4, 8, 3, 1, 9, 5, 7] ausgegeben werden sollte?:

public int[] evenNumbersFirst(int[] input) {
	Integer[] array = Arrays.stream(input).mapToObj(Integer::valueOf).toArray(Integer[]::new);
	Arrays.sort(array, (a, b) -> (a % 2 == 0 ? 0 : 1) - (b % 2 == 0 ? 0 : 1));
	System.out.println(Arrays.toString(array));
	return Arrays.stream(array).mapToInt(Integer::intValue).toArray();
}

/e Anstatt Sortieren wäre auch die Partitionierung denkbar.

@thisisacting Eine recht einfache Lösung wäre, ein neues Array gleicher Größe anzulegen, sich den ersten und letzten Index zu merken, und dann die geraden Elemente nach vorne und die ungeraden nach hinten zu packen (und natürlich dann den jeweiligen Index anzupassen).

public int[] evenNumbersFirst(int[] input) {
    int[] output = new int[input.length];
    int evenIndex = 0;
    int oddIndex = output.length-1;
    for(int value : input) {
         if (value % 2 == 0) { //gerade
             //dieser Teil der Aufgabe bleibt dem Leser überlassen
         } else { //ungerade
             //dieser auch
         }
    }
    return output;
}

@CyborgBeta Interessante Lösunge (obwohl das mit dem Comparator schon leichter Missbrauch ist), aber denkst du wirklich, es ist eine gute Idee, jemanden der gerade mit Java anfängt, und lernen möchte, wie man mit Arrays arbeitet, Streams und Lambdas um die Ohren zu hauen?

Nicht ganz. Aber vielleicht für später mal…

Danke. Zur sortiere-Lösung bin ich auch erst gelangt, nachdem das TS geschrieben hat.

Ich find’s gut, dass du die Lösung so, wie sie vermutlich verlangt wird, noch offen gelassen hast… (zum Selber-Knobeln-und-Herausfinden…)

Ohje, Java-Tags falsch benützt.

Hier noch schnell die drei Möglichkeiten:

	public int[] evenNumbersFirst0(int[] input) {
		int[] output = new int[input.length];
		int evenIndex = 0;
		int oddIndex = output.length - 1;
		for (int value : input) {
			if (value % 2 == 0) { // gerade
				// dieser Teil der Aufgabe bleibt dem Leser überlassen
			} else { // ungerade
				// dieser auch
			}
		}
		return output;
	}
	public int[] evenNumbersFirst1(int[] input) {
		Integer[] array = Arrays.stream(input).mapToObj(Integer::valueOf).toArray(Integer[]::new);
		Arrays.sort(array, (a, b) -> (a % 2 == 0 ? 0 : 1) - (b % 2 == 0 ? 0 : 1));
		return Arrays.stream(array).mapToInt(Integer::intValue).toArray();
	}
	public int[] evenNumbersFirst2(int[] input) {
		Map<Boolean, List<Integer>> collect = Arrays.stream(input).mapToObj(Integer::valueOf).collect(Collectors.partitioningBy(a -> a % 2 == 0));
		collect.get(true).addAll(collect.get(false));
		return collect.get(true).stream().mapToInt(Integer::intValue).toArray();
	}

Und ein Aufruf-Beispiel:

System.out.println(Arrays.toString(new Test1().evenNumbersFirst1(new int[] { 3, 2, 1, 9, 6, 5, 4, 7, 8 })));

evenNumbersFirst2 wäre noch mehr Stream-like. :slight_smile:

Lasst ihn doch selbst eine Lösung erarbeiten. Über ernsthafte Lösungsansätze kann man diskutieren, aber bisher wurde keine Frage gestellt.

1 „Gefällt mir“

Ich fürchte, wir sind einem Troll aufgesessen, da keine Antwort mehr und die Frage auch in einem anderen Forum gestellt wurde.
Aber allgemein hast du recht. :slight_smile:

Das ist aber auch eine interessante Lösung. Aber kann es sein, dass die ungeraden Zahlen auf die Art in umgekehrter Reihenfolge in das Array kommen? Ich würde mir die ungeraden Zahlen rauspicken und mit dem Ergebnis einer nextEven-Methode austauschen, solange dieses Ergebnis nicht <0 ist.

```
public int[] evenNumbersFirst(int[] input) {
    int ne = -1;
    for(int n=0; n < input.length; n++) {
         if (input[n] % 2 != 0) {
             if((ne = nextEven(n, input)) < 0) {
                 break;
             }
             input[n] += input[ne];
             input[ne] = input[n] - input[ne]
             input[n] -= input[ne];
         }
    }
    return input;
}

public int nextEven(int fromIndex, int[] input) {
    for(;fromIndex < input.length; fromIndex++) {
        if(input[fromIndex] % 2 == 0) {
            return fromIndex;
        }
    }
    return -1;
}

Auf die Art lernt er auch gleich, dass Arrays (bzw. Objekte allgemein) per Referenz übergeben werden.
Okay, bei nochmaligem Überlegen fällt mir auf, dass die ungeraden Zahlen nun vollkommen durcheinander geraten können (oder nicht? Bin mir nicht sicher), aber egal.

Es ist noch nicht ersichtlich, in welcher Reihenfolge die ungeraden Zahlen anschließend ausgegeben werden sollen…

Bei meinen drei Vorschlägen hab ich die Reihenfolge beibehalten…

@thisisacting Klär’ uns doch mal auf.

(/e Hier schreibt CyborgBeta)