2017-11-07 3 views
4

問題は、私は、Java初心者ですのJava - テキストファイルの行数を検出して計算を行う方法がわからない

を解決し、いくつかの問題を発見しました。

SalesData.txtには、小売店が毎日何週間もかけて行った1ドルの売上高を含むファイルがあります。ファイルの各行には7つの数字が含まれています。これは1週間の毎日の売上です。数字はコンマで区切られています。以下では、ファイルからの例です:

1245.67,1490.07,1679.87,2371.46,1783.92,1461.99,2059.77 
2541.36,2965.88,1965.32,1845.23,7021.11,9652.74,1469.36 
2513.45,1963.22,1568.35,1966.35,1893.25,1025.36,1128.36 

私は、二重に文字列を変換し、計算しようとしています

  • 毎週
  • の総売上各週の平均日販
  • すべての週間総売上
  • 週平均販売

私の質問は、第1週として第1行、第2週として第2行などを検出する方法です。そして、金額を計算します。構文は次のとおりです。

+0

に行くことができる和のこのリストでは

List<Double> weekSums = lines.map(line -> { List<String> asList = Arrays.asList(line.split(",")); return asList.stream().mapToDouble(Double::parseDouble).sum(); }).collect(Collectors.toList()); 

を何問題ですか? 1行ずつ読むと、週は '\ n'で区切られますので、whileループの繰り返しごとに別の週を扱います。あなたが聞いたことを理解していない。 –

+0

各行は1週間表示されていますので、ファイルから週数を取得するにはどうすればよいですか? –

+0

'while'ループの中で、行を読み込むたびにインクリメントするカウンタはどうでしょうか? – sinclair

答えて

0

値を読み取る部分を提供します。これは、単に「行う方法を知っておく必要がある」ためです。

ファイルごとに1行(外側のループ)を読み込み、分割された各行の値を繰り返し読み込むことができますchar ','(内部ループ)。 lineIndexは、あなたが見ている週の値を常に教えてくれます。それはExceptionがスローされた場合でも、読者が閉じてしまいますことを保証として我々は、試して-とのリソースブロックを使用します。私たちがここで何をしているかについての

try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
    int lineIndex = 0; 
    String line; 
    while ((line = br.readLine()) != null) { 
     String[] values = line.split(","); 
     for (int i = 0; i < values.length; i++) { 
      double value = Double.valueOf(values[i]); 
      // do stuff with your number 
     } 
     lineIndex++; 
    } 
} 

より詳細な説明。 BufferedReaderFileReader経由)は、br.readLine()と呼び出すたびにファイルを読み取ります。これは、,で区切られたすべての値を含む行です。だから我々は、それは内側のリストは、特定の週の売上を表しリストのリスト、のように聞こえる、と外側のリストは、週のすべてを表しStringの配列にStringsplit()Double.valueOf()

1

で各Stringを変換します:

List<List<Double>> saleWeeks; 

ファイルを解析すると、それぞれの行はとても新しいリストを追加週を表します

List<Double> salesForTheWeek = new ArrayList<>(); 
saleWeeks.add(salesForTheWeek); 
// parse the line of the file and add the values to salesForTheWeek 

その後、毎週、インデックスに関連している:

List<Double> week1Sales = saleWeeks.get(0); 

次に、加算、平均などを繰り返すことができます。

1

のプロパティをカプセル化するクラスのWeeklySalesを作成する:「毎週 の総売上各行の計算のために毎週

の平均の毎日の売上

「毎週の総売上」と 毎週の平均日売上 "とWeeklySalesクラスのリストに入力します。下記計算するWeeklySalesクラスの

使用リスト:

週平均販売

は、2つのプロパティとオブジェクトのリストの上に保持し、それを使用する別のクラスを作成します すべての週間総売上。

1回の反復で、必要なプロパティを含むモデルを作成することもできます。

0

タスク用にファイルの行からなるJava 8ストリームを使用できます。

Files.linesメソッドを使用してストリームを取得します。

Stream<String> lines = Files.lines(Paths.get(yourFileName)); 
//To obtain the number of weeks 
long numberOfWeeks = lines.count(); 

または毎週の合計を取得するには、の線に沿って何かしてみてください:あなたは計算の平均値など

double sumOfAllWeeks = weekSums.stream().mapToDouble(Double::doubleValue).sum(); 
Double allWeeksAverage = weekSums.stream().collect(Collectors.averagingDouble(d -> d)); 
関連する問題