Methoden Arrays

Bitte aktiviere JavaScript!
Stehe gerade voll auf dem Schlauch bei dieser eig leichten Aufgabe.... LG
20190716_175626.jpg
 
Java:
public static boolean includes(int[] arr1, int[] arr2) {
  return IntStream.of(arr1).allMatch(i -> IntStream.of(arr2).anyMatch(j -> i == j));
}
Zum Thema Streams bin ich echt zwiegespalten. Zum einen bin ich immer wieder erstaunt wie einfach man damit solche Probleme lösen kann. Zum anderen finde ich jedoch die Lesbarkeit unter aller Kanone...o_O
 
Zum anderen finde ich jedoch die Lesbarkeit unter aller Kanone
Aus meiner Sicht zwei Gründe:
1. Gewohnheit: Wir sind es einfach gewohnt, imperativ zu denken, weil das das erste Paradigma ist, nach dem wir lernen
2. Syntax: Javas Syntax für funktionale Programmierung setzt auf der Syntax für imperative objektorientierte Programmierung auf und es wird hier und dort ein Pflaster angeklebt, so dass es ein bisschen so aussieht wie funktional aber nicht die Grammatik der Sprache kaputt macht. Ich persönlich finde die Syntax für Funktionskomposition in Java schrecklich, finde es doof, dass es kein Currying gibt, dass es keine schöne partielle Anwendung von Funktionen gibt (hauptsächlich dadurch geschuldet, dass Java ein nominales und kein strukturelles Typsystem verwendet, bei dem alle Typen einem benamten Typ/Klasse/Interface zugeordnet sein müssen) und kein pointfree Style für funktionale Ausdrücke, finde es doof, dass es keine "Funktionen" als first-class citizens in der Sprache gibt (alles wird auf single-abstract-method interfaces abgebildet). Andere Sprache sind da natürlich Java meilenweit voraus, weil sie einfach früher damit angefangen haben und sich einen Dreck um Abwärtskompatibilität oder Migrationskompatibilität gekümmert haben (ich gucke auf dich, Haskell). Allerdings haben die meisten dieser Sprachen auch solch eine geringe Userbasis, dass sie das einfach können. Java hingegen nicht.
 
Zuletzt bearbeitet:
... Ich frage mich manchmal ob wirklich eine Notwendigkeit bestand Java funktional zu machen. Ich denke wenn ich "rein" funktional programmieren möchte, dann wähle ich eben eine funktionale Sprach wie zB Haskell.
Wenn ich "rein" logisch programmieren möchte dann eben Prolog.
Und wenn ich Constraintprogrammieren möchte dann eben ??.
 
Tja... der Zeitgeist wollte es so. "Everybody else is doing it." Und eigentlich möchte man kaum "nur" funktional oder "nur" imperativ/nebeneffektbehaftet programmieren. Mal ist das eine besser, mal das andere. Jenachdem, welches (Teil-)Problem man eben gerade lösen muss.
 
Wie erreiche ich denn das jedes Element von arr1 einmal arr2 durchläuft und erst dann true zurückgibt, wenn ich mit allen Elementen aus arr1 durch bin und diese in arr2 enthalten sind. Egal an welcher Stelle des arr2
 
Zerteile das Problem vielleicht erstmal in Teilprobleme:
1. Teilproblem: Prüfen, ob ein Array genau ein Element enthält: `boolean contains(int value, int[] array)`
2. Teilproblem: Prüfen, ob alle Werte in array1 auch in array2 sind: `boolean contains(int[] array1, int[] array2)`. Hier benutzt du die Lösung von 1.
Java:
private static boolean contains(int v, int[] arr) {
  for (int i = 0; i < arr.length; i++)
    if (arr[i] == v)
      return true;
  return false;
}
public static boolean contains(int[] arr1, int[] arr2) {
  for (int i = 0; i < arr1.length; i++)
    if (!contains(arr1[i], arr2))
      return false;
  return true;
}
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben