2016-09-15 7 views
0

Grundsätzlich muss ich Folgendes tun: 1) Lesen Sie die CSV-Eingabedatei. 2) Filtern Sie die CSV-Daten basierend auf der Blacklist. 3) Sortieren Sie die Eingabe basierend auf den Ländernamen in aufsteigender Reihenfolge. 4) Drucken Sie die Datensätze, die nicht auf der schwarzen Liste stehen. Die CSV-Datei enthält: id, Land-short, Land 1, AU, Australien 2, CN, China 3, AU, Australien 4, CN, China Die schwarze Liste Datei enthält: AU JP Und der gewünschte Ausgang ist 2, CN, China 4, CN, ChinaWie überprüft man den Inhalt des Stream-Objekts ohne Konvertierung in Array in Java 8?

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.Optional; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

public class StreamProcessing { 
    public static void filterCsv(String fileName, String blacklistFile){ 


     try (Stream<String> stream1 = Files.lines(Paths.get(fileName))) { 
      Stream<String> stream2 = Files.lines(Paths.get(blacklistFile)); 
      Optional<String> hasBlackList = stream1.filter(s->s.contains(stream2)).findFirst(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 



    public static void main(String args[]) 
    { 
     StreamProcessing sp = new StreamProcessing(); 
     sp.filterCsv("Data.csv","blacklist.txt"); 
    } 
} 

I die Einträge entfernt werden soll, die aus dem Vergleich von dem ersten Strom in der zweiten Strom vorhanden sind, ohne sie in eine Anordnung umzuwandeln?

+0

Was genau versuchen Sie zu tun? Möchten Sie herausfinden, ob der erste Stream einen String enthält, der im zweiten Stream angezeigt wird? – Eran

+0

Versuchen Sie einige Informationen zu der Frage hinzuzufügen, wie haben die CSV und TXT-Datei die gleiche Struktur und brauchen Sie wirklich den ersten Eintrag oder nur die Information, dass es eine "Verletzung" gibt. – meistermeier

+0

Bitte lesen Sie http://stackoverflow.com/help/how-to-ask. Sagen Sie uns, was Sie bereits versucht haben und was nicht funktioniert. –

Antwort

3

Sie können einen Stream nur einmal konsumieren. Da Sie Zugriff auf alle Mitglieder der Blacklist benötigen, während Sie jedes Mitglied der Hauptdatei auswerten, müssen Sie zuerst den Blacklist-Stream vollständig konsumieren. Konvertieren Sie aus Effizienzgründen nicht in ein Array, sondern in ein HashSet.

+0

Dies ist der Ort, an dem wir die Stream-API loben sollten, um den Entwickler zu zwingen, in ein Set zu sammeln, anstatt eine 'n × m'-Operation zuzulassen ... – Holger

1

Leider können Sie einen Stream nicht mehr als einmal verwenden, so dass Code, der den Blacklist-Stream für jede Zeile überprüft, fehlschlägt. Die einfachste Lösung wäre, die Blacklist in einer Sammlung zu speichern und dann jede Zeile zu prüfen.

List<String> blacklist = Files.readAllLines(Paths.get(blacklistFile)); 
boolean hasBlacklist = Files.lines(Paths.get(filename)).anyMatch(blacklist::contains); 
+0

wäre vielleicht ein' HashSet' eine effizientere Wahl als eine 'List', die wiederholt Gegenstände nachschlägt. –

Verwandte Themen