Wie kann ich Arrays sortieren?

12/08/2016 14:20 ¤Freakieh¤#1
Hallo Leute,

wie kann ich zwei Arrays sortiert ausgeben lassen? Habe im Internet geschaut, aber ich blicke da immer noch nicht durch.

Bspw. Array hat 9,8,7,6,5 und Array2 hat 4 3 2 1

Kann ich das beides irgendwie zusammen und sortiert ausgeben lassen? Und was bedeutet "merge" ? Danke euch im Voraus !
12/08/2016 15:54 Belur#2
"merge" heißt einfach nur zusammenfügen.
[Only registered and activated users can see links. Click Here To Register...]

Zwei Arrays kannste zB. so mergen und sortiert ausgeben. Fürs Sortieren gibts Standardmethoden. In deinem Fall wären die beiden Arrays nach dem mergen ja schon absteigend sortiert, deshalb mal ein Beispiel wie man es aufsteigend sortieren würde:
Code:
    public static void main(String[] args) {
        int[] arr1 = new int[]{9, 8, 7, 6, 5};
        int[] arr2 = new int[]{4, 3, 2, 1};

        //ohne Java8 Streams
        int[] result = new int[arr1.length + arr2.length];
        System.arraycopy(arr1, 0, result, 0, arr1.length);
        System.arraycopy(arr2, 0, result, arr1.length, arr2.length);
        Arrays.sort(result);
        System.out.println(Arrays.toString(result));

        //mit Java8 Streams
        System.out.println(Arrays.toString(IntStream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).sorted().toArray()));
    }
12/08/2016 16:39 ¤Freakieh¤#3
Quote:
Originally Posted by Belur View Post
"merge" heißt einfach nur zusammenfügen.
[Only registered and activated users can see links. Click Here To Register...]

Zwei Arrays kannste zB. so mergen und sortiert ausgeben. Fürs Sortieren gibts Standardmethoden. In deinem Fall wären die beiden Arrays nach dem mergen ja schon absteigend sortiert, deshalb mal ein Beispiel wie man es aufsteigend sortieren würde:
Code:
    public static void main(String[] args) {
        int[] arr1 = new int[]{9, 8, 7, 6, 5};
        int[] arr2 = new int[]{4, 3, 2, 1};

        //ohne Java8 Streams
        int[] result = new int[arr1.length + arr2.length];
        System.arraycopy(arr1, 0, result, 0, arr1.length);
        System.arraycopy(arr2, 0, result, arr1.length, arr2.length);
        Arrays.sort(result);
        System.out.println(Arrays.toString(result));

        //mit Java8 Streams
        System.out.println(Arrays.toString(IntStream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).sorted().toArray()));
    }
Hey, danke dir für die Lösung und Erklärung :)

Wann genau würde man denn die Lösung mit den Java8 Streams benutzen? Gibt es da irgendwie Empfehlungen, wann man was nutzen sollte oder soll man das nehmen, was einem besser "einleuchtet" und "leichter" zum schreiben ist?
12/08/2016 16:48 Belur#4
Würde das nehmen was dir besser gefällt. Oft lassen sich Sachen mit Streams kürzer schreiben bzw. leichter in einem Befehl zusammenfassen. Wird dann aber manchmal auch schwerer lesbar.

Falls Performance ne Rolle spielt könnte das auch ein Grund sein keine Streams zu benutzen. Ich bin mir ziemlich sicher, dass die erste Variante schneller ist ;) Wobei das bei diesen geringen Zeiten natürlich irrelevant ist.
12/08/2016 17:06 ¤Freakieh¤#5
Quote:
Originally Posted by Belur View Post
Würde das nehmen was dir besser gefällt. Oft lassen sich Sachen mit Streams kürzer schreiben bzw. leichter in einem Befehl zusammenfassen. Wird dann aber manchmal auch schwerer lesbar.

Falls Performance ne Rolle spielt könnte das auch ein Grund sein keine Streams zu benutzen. Ich bin mir ziemlich sicher, dass die erste Variante schneller ist ;) Wobei das bei diesen geringen Zeiten natürlich irrelevant ist.
Okay, danke dir :) Hilfst echt weiter :D

Kann man die Java8 Streams eigentlich überall anwenden, wo es eine Rückgabe mit System print ln gibt?
12/08/2016 17:13 Belur#6
Die System.out.println() Methode hat ja keinen Rückgabewert (void).

Mit Streams kann man sehr viel machen (dieses Beispiel war jetzt eher etwas trivialeres), gibt auch etliche Tutorials dazu. Oft ist das sehr praktisch um Sachen kurz zu fassen.
12/09/2016 17:06 th0rex#7
Quote:
Originally Posted by Belur View Post
Falls Performance ne Rolle spielt könnte das auch ein Grund sein keine Streams zu benutzen. Ich bin mir ziemlich sicher, dass die erste Variante schneller ist ;) Wobei das bei diesen geringen Zeiten natürlich irrelevant ist.
Warum genau sollte das 1. schneller sein ? Und performance ist nie irrelevant.
12/09/2016 19:23 Belur#8
Quote:
Originally Posted by C0untLizzi View Post
Warum genau sollte das 1. schneller sein ? Und performance ist nie irrelevant.
Ob Performance relevant ist liegt wohl immer noch am jeweiligen Use-Case. Wenn man eine Webanwendung oder ähnliches hat, machen die paar Nanosekunden keinen Unterschied. Da ist Lesbarkeit etc. wichtiger.

Und warum das 1. Programm schneller ist? Vermutlich weil System.arraycopy nativ implementiert ist und was uU deutlich schneller sein kann. Wobei das bei Arrays dieser Größenordnung ohnehin völlig irrelevant ist. Vllt. werden Streams von der JVM auch nicht so gut optimiert oder ähnliches. Du kannst ja mal selbst messen und gucken was schneller ist ;)

Hier mal eine Messung von mir:
PHP Code:
@State(Scope.Thread)
public class 
Test {

    
int[] arr1 = new int[]{98765};
    
int[] arr2 = new int[]{4321};

    public static 
void main(String[] argsthrows RunnerException {
        
Options opt = new OptionsBuilder()
                .include(
Test.class.getSimpleName())
                .
warmupIterations(1000)
                .
measurementIterations(1000)
                .
timeUnit(TimeUnit.NANOSECONDS)
                .
mode(Mode.AverageTime)
                .
forks(1)
                .
build();

        new 
Runner(opt).run();
    }

    
//@Benchmark 
    
public int[] streamBenchmark() {
        return 
IntStream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).sorted().toArray();
    }

    
//@Benchmark
    
public int[] regBenchmark() {
        
int[] result = new int[arr1.length arr2.length];
        
System.arraycopy(arr10result0arr1.length);
        
System.arraycopy(arr20resultarr1.lengtharr2.length);
        
Arrays.sort(result);
        return 
result;
    }

Mit dem Ergebnis:
Code:
Benchmark             Mode  Cnt    Score   Error  Units
Test.regBenchmark     avgt  1000   79,475 ± 1,531  ns/op
Test.streamBenchmark  avgt  1000  188,236 ± 1,402  ns/op
Und damit siehst du auch, dass sich meine Vermutung bestätigt hat. Streams sind fast immer langsamer als vergleichbare Collections Iterationen oder Ähnliches.