2017-12-09 2 views
0

Ich habe eine harte Zeit. Ich versuche, eine Zuweisung zu beenden, in der auf ein Verzeichnis von Dateien zugegriffen wird und die Dateien zählen, dann werden die Dateien selbst gelesen und die Wörter werden in jeder Datei gezählt. Dies ist die Fortsetzung einer Frage, die ich geschrieben habe, aber die „Antworten“ nicht helfen, mein Problem bei allen (How to count words in a text file, java 8-style)Wie man Dateien zählen und Wörter in einer Reihe von Dateien zählen Mit Java 8 und Streams

Das ist das Problem Umriss zu beheben:

Schreiben Sie ein Programm, das verwendet Streams effizient zählen die Wörter unterschiedlicher Länge erscheinen in einer Reihe von Dateien (files.zip). Ihre Ausgabe sieht folgendermaßen aus: (Die Zahlen dienen nur zur Illustration).

Count 11 files: 
word length: 1 ==> 80 
word length: 2 ==> 321 
word length: 3 ==> 643 

Instead, I got the following output: 

primes.txt 
Count: 1 files 

Dies ist der Code, den ich geschrieben habe. Ich habe zwei Klassen Filereader verwendet, die die Hauptklasse ist, die ein Verzeichnis „Dateien mit dem Namen lautet:.

FileReader.java 

    import java.io.IOException; 
    import java.nio.file.DirectoryStream; 
    import java.nio.file.Files; 
    import java.nio.file.Path; 
    import java.nio.file.Paths; 
    import java.util.ArrayList; 
    import java.util.List; 

    /* 
    * To change this license header, choose License Headers in Project Properties. 
    * To change this template file, choose Tools | Templates 
    * and open the template in the editor. 
    */ 

    /** 
    * 
    * @author 
    */ 
    public class FileReader { 

     public static void main(String args[]) { 
      List<String> fileNames = new ArrayList<>(); 
      try { 
       DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get("files")); 
       int fileCounter = 0; 
       **WordReader wordCnt = new WordReader();** 
       for (Path path : directoryStream) { 
        System.out.println(path.getFileName()); 
        fileCounter++; 
        fileNames.add(path.getFileName().toString()); 
        **System.out.println("word length: " + fileCounter + " ==> " 
          + wordCnt.count(path.getFileName().toString()));** 
       } 
      } catch (IOException ex) { 
      } 
      System.out.println("Count: " + fileNames.size() + " files"); 

     } 
    } 

Und die WordReader Klasse, die in der Theorie sollte die Worte in jeder Datei im Verzeichnis zählt die Klasse in in Lambda-Syntax geschrieben:

import java.io.IOException; 
    import java.nio.file.Files; 
    import java.nio.file.Path; 
    import java.nio.file.Paths; 
    import java.util.AbstractMap.SimpleEntry; 
    import java.util.Arrays; 
    import java.util.Map; 
    import static java.util.stream.Collectors.counting; 
    import static java.util.stream.Collectors.groupingBy; 

     /** 
     * 
     * @author 
     */ 
     public class WordReader { 

      /** 
      * 
      * @param filename 
      * @return 
      * @throws java.io.IOException 
      */ 
      public Map<String, Long> count(String filename) throws IOException { 
       //Stream<String> lines = Files.lines(Paths.get(filename)); 
       Path path = Paths.get(":"); 
       Map<String, Long> wordMap = Files.lines(path) 
         .parallel() 
         .flatMap(line -> Arrays.stream(line.trim().split(" "))) 
         .map(word -> word.replaceAll("[^a-zA-Z]", "").toLowerCase().trim()) 
         .filter(word -> word.length() > 0) 
         .map(word -> new SimpleEntry<>(word, 1)) 
         //.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum)); 
         .collect(groupingBy(SimpleEntry::getKey, counting())); 

       wordMap.forEach((k, v) -> System.out.println(String.format(k,v))); 
       return wordMap; 
      } 
     } 

ich glaube, ich habe ein Problem mit der WordReader Klasse aufrufen (Hervorgehoben in BOLD), die den Zähler stoppt, aber ich weiß nicht, wie es zu lösen, und ich habe versucht, um den Klassenaufruf ohne Erfolg in die for-Schleife zu verschieben Wenn ich die Zeilen auskommentiere, dann läuft der Dateizähler gut weiß jemand, dass ich tun kann, um dieses Programm "laufen zu lassen (Dateien zählen) und Kaugummi zu kauen (Wörter in Dateien zählen)"?

+0

Du bist wahrscheinlich eine Ausnahme, dass die Datei „bekommen: "existiert nicht, check' Path path = Paths.get (":"); '. – Edwardth

+0

tat ich, aber selbst wenn ich eine tatsächliche Datei Ex: haiku.txt eingeben, passiert das Gleiche. –

+0

Drucken Sie die Ausnahme, die Sie in Main fangen mit 'ex.printStackTrace();' – Edwardth

Antwort

0

Hier sind einige Fehler, die Sie gemacht:

  • nur die Dateinamen count() vorbei, da die Datei in einem Verzeichnis ist es besser ist, den ganzen Weg zu passieren.
  • mit dem Pfad :, auch ist es kein gültiger Dateiname!
  • Nicht protokollieren die Ausnahme, die ausgelöst wird, verstecken Sie das eigentliche Problem.
  • Verwendung von Lambda, wenn Sie immer noch mit den meisten der Java-Sprache kämpfen.

Dies sollte funktionieren:

Main.class:

public class Main { 
    public static void main(String[] args) { 
     List<String> fileNames = new ArrayList<>(); 
     try { 
      DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get("files")); 
      int fileCounter = 0; 
      WordReader wordCnt = new WordReader(); 
      for (Path path : directoryStream) { 
       System.out.println(path.getFileName()); 
       fileCounter++; 
       fileNames.add(path.getFileName().toString()); 
       System.out.println("word length: " + fileCounter + " ==> " + wordCnt.count(path)); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     System.out.println("Count: " + fileNames.size() + " files"); 
    } 
} 

WordReader.class:

public class WordReader { 
    public Map<String, Integer> count(Path filePath) throws IOException { 
     Map<String, Integer> wordMap = Files.lines(filePath) 
       .flatMap(line -> Arrays.stream(line.trim().split(" "))) 
       .map(word -> word.replaceAll("[^a-zA-Z]", "").toLowerCase().trim()) 
       .filter(word -> word.length() > 0) 
       .collect(Collectors.groupingBy(s->s, Collectors.counting())); 

     wordMap.forEach((k, v) -> System.out.println(String.format(k, v))); 
     return wordMap; 
    } 
} 
+0

Sie machen es wahrscheinlich nur noch schlimmer hinzufügen 'parallel' für Dateien Verarbeitung hier – Eugene

+0

@Eugene' parallel' ist entfernt, ich habe nur die Teile aus dem Code mit verursachten Schwierigkeiten geändert. – Edwardth

Verwandte Themen