Entferne max (oder min) aus der Sammlung mithilfe der Java8-Streaming-API

8

Ich habe wenig Probleme mit Code-Design, die neue Streaming-API von Java 8 verwenden. Ich möchte neue Dinge lernen und eine der Aufgaben ist:

Max und Min von der Liste ablehnen. Liste enthält keine Duplikate.

Sieht einfach aus? Nein ... Mein Code:

%Vor%

Dieser Code ist gut (wenn wir nur Duplikate von min / max haben, aber das ist hier kein Kernproblem), aber das Problem ist, dass ich hier drei Streams verwende. Der erste ist der Hauptstrom, der zweite um den maximalen und der dritte den minimalen zu entfernen. Gibt es eine Möglichkeit, diese Aufgabe in einem Stream zu erledigen?

// bearbeiten: Sehr primitive Scala-Version:

%Vor%

mit zusätzlicher Sortierung, weil wir eine Liste haben könnten.

    
Koziołek 07.04.2014, 11:25
quelle

2 Antworten

6

Die Lösung ist nicht sehr effizient, aber ich denke, sie entspricht Ihren Anforderungen - sie macht, was Sie wollen, und sie befindet sich in einer einzigen -Pipeline - einer einzigen Folge von Massendatenoperationen, wie Java 8 aufruft es.

%Vor%

Aber wie fge vorgeschlagen wurde und Marco13 in ihren Kommentar unter Ihre Frage geschrieben hat, wäre es besser und viel effizienter, den Stream zu sortieren, die Pipeline auf eine Liste zu terminieren und dann das erste und das letzte Mitglied zu entfernen: P Or Noch schneller ohne Sortieren - gehe durch alle Elemente, finde Min und Max, merke dir ihre Position und entferne sie dann.

    
Honza Zidek 07.04.2014, 21:26
quelle
24

Vergessen Sie nicht Collection.removeIf . Sie können min und max berechnen und dann tun:

%Vor%

(Dies gilt auch für Duplikate.)

    
Brian Goetz 10.07.2014 15:54
quelle
Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ answer1666599 ___

Sind Sie sicher, dass das C ist?

Das Standarddokument, mit dem Sie verbunden sind, beschreibt keine solche Syntax, die ich sehen könnte.

Das sieht nach C ++ aus, wo es tatsächlich verwendet wird, um zu sagen, dass die Struktur eine andere Struktur erbt. Die TeXmacs-Kompilierungsseite empfiehlt Ihnen, einen C ++ - Compiler zu verwenden, was (für mich) bedeutet, dass dies der Fall ist geschrieben in C ++, nicht C.

Ich habe einen kurzen Blick in das TeXmacs Quellarchiv geworfen und viele ".cpp" Dateien gesehen.

    
___ answer1666630 ___

GCC mag es nicht (natürlich im C-Modus).

Und wenn ich mir die Spezifikation anschaue, sehe ich nicht das, was auf Seite 113 (6.7.2.1) definiert ist, es heißt:

%Vor%

Dies ist die Syntax für Bitfelder wie folgt:

%Vor%

Also zusammenfassend: Das ist nicht C, es ist C ++ und es ist Vererbung wie Klassenvererbung.

    
___ answer1666632 ___

Der %code% im Text des Standards ist nicht Bestandteil der C-Konstruktion. Es ist da, um das zu definierende Ding und seine Definition zu trennen.

Es gibt keine gültige Verwendung von %code% in einer Strukturdeklaration.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstntxt ___

Als ich den Code von TeXmacs gelesen habe, habe ich Folgendes gesehen:

%Vor%

Was heißt das?

Diese Syntax ist im C-Standard , S. 113 definiert. aber ich habe die Bedeutung nicht gefunden, aber das ist, weil ich nicht weiß, wie man Grammatikregeln liest.

Weil %code% ein anderes %code% ist, das Funktionen wie einen Konstruktor und einen virtuellen Destruktor enthält, und weil ich an anderer Stelle gelesen habe, dass Klassen in C ++ eigentlich %code% mit öffentlichen Membern sind, nehme ich an, dass dies der Fall ist die Art der Vererbung mit %code% in C (weil es der C-Standard ist ...).

Stimmt das?

    
___ answer1666617 ___

Es ist C ++ - Syntax und entspricht dem:

%Vor%

Dies ist die normale Syntax für die Vererbung von Klassen, hier wird %code% von %code% geerbt.

Über diese Syntax in C:

Der C-Standard, mit dem Sie verbunden sind, definiert (6.7.2.1):

%Vor%

Nach C muss es also %code% sein, gefolgt von einem optionalen Identifier, gefolgt von %code% . Oder nur %code% gefolgt von einem Identifier (eine Forward-Deklaration). In beiden Fällen ist dort noch Platz für ein zusätzliches %code% .

Das %code% , das später in diesem Absatz des Standards erwähnt wird, handelt von Bit-Feld-Breiten wie diesem;

%Vor%

Hier sind %code% und %code% nur 4 und 3 Bits breit, aber das ist eine andere Syntax als in der Frage.

    
___