2016-11-17 9 views
0

Ich habe eine Textdatei wie in/1 /. Die erste Spalte ist Produktvolumn und die zweite Spalte ist Produktgewicht. Mein pupose es um total_Volumn/total_Weight zu berechnen. Frühere Java-Version muss alle Zeilen lesen, dann analysieren und für Schleife ...., sowieso viele Zeilen. Aber das wird durch Single-Thread berechnet. Ich möchte Java 8 Feature, wie uns Karte, reduzieren, um diese Berechnung mit wenigen Zeilen zu machen. Außerdem ist die Berechnung effizienter, da Java8 Multithreads verwendet.Java 8 Datei readAllines Karte und reduzieren

/1/textData.txt

Volumn Weight 
1010.0 3458 
34334 322 
3434 343 
3433 542 
3134 146 
3393 246 
... 
9787 3023 

Antwort

1

Sie können versuchen, diese wie folgt:

package com.grs.stackOverFlow.pack06; 

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

class Data{ 
    private Double volume; 
    private Double weight; 

    public Data(String string, String string2) { 
     setVolumeString(string); 
     setWeightString(string2); 
    } 
    public Double getVolume() { 
     return volume; 
    } 
    public Double getWeight() { 
     return weight; 
    } 

    public void setVolumeString(String volumeStr){ 
     this.volume=Double.valueOf(volumeStr); 
    } 

    public void setWeightString(String weightStr){ 
     this.weight=Double.valueOf(weightStr); 
    } 

} 
public class FileSummary01 { 

    public static void main(String[] args) throws IOException { 

     List<String> lines = Files.readAllLines(Paths.get("src/com/grs/stackOverFlow/pack06/data.txt")); 

     List<Data> data=lines.stream() 
            .skip(1) 
            .map(t-> 
              { String [] a =t.split("\\s+"); 
               System.out.printf("arr : %s %s %n",a[0],a[1]); 
               return new Data(a[0],a[1]);}).collect(Collectors.toList()); 

     System.out.println("sum of volume : " + data.stream().mapToDouble(Data::getVolume).sum()); 
     System.out.println("sum of weight : " + data.stream().mapToDouble(Data::getWeight).sum()); 

    } 

} 

Wenn Sie haben große Datenmengen, die Sie parallel streamen können, anstatt zu streamen.

0

Wenn Ihr Ziel etwas in einer Zeile zu tun ist, dann

Files.lines(Paths.get("/path/to/file.txt")).map(line -> line.split("\t")).mapToDouble(vw -> Double.parseDouble(vw[0])/Double.parseDouble(vw[1])).sum(); 
+1

Aber das gibt Ihnen möglicherweise keine Geschwindigkeitsverbesserung gegenüber der Java 7-Methode zum Lesen einer Datei. Für den Leistungsvergleich von Singlethread vs. Multithread-Implementierungen siehe http://stackoverflow.com/a/40597140/3867574 –

+1

Ihre Antwort ist nicht korrekt. Eigentlich will ich Summe (Volumen)/Summe (Gewicht), nicht Summe (v1/w1 + v2/w2 + ... vn/wn). Der von Ihnen angebotene Link ist wirklich exzellent, da er eine andere Lesart einer Datei zeigt. Danke trotzdem. – user84592