質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

1009閲覧

改行で区切られたファイルデータを配列に格納したい

javamurisugiru

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/08 16:49

前提・実現したいこと

お世話になっております。

今回は、出席番号が書かれたファイルと採点結果が書かれたファイルを照合し、出席番号が一致したデータのみを出力しようとしています。出力したデータの合計点と平均点もそれぞれ表示します。

【出席番号データの例】
01
03
04
05
06
07

【採点結果データの例】
01 MATSUMOTO 090 075 100
02 KAWAUCHI 100 055 080
03 KANBA 040 100 050
05 ASANUMA 060 090 070
07 YAMASHITA 070 100 060
10 INAGAKI 010 050 030

【期待する結果の例】
出席番号 名前 英語 数学 国語 合計点 平均点
1 MATSUMOTO 90 75 100 265 88
3 KANBA 40 100 50 190 63
5 ASANUMA 60 90 70 220 73
7 YAMASHITA 70 100 60 230 76

ファイルを読み込んだ後、readを用いて取得した一行分のデータをsplitで分割し、配列に格納してから比較を行おうとしているのですが、出席番号データが改行で区切られているため、一つの配列に格納する方法が分かりません。
そもそも改行されたデータを一つの配列に格納することは可能でしょうか?

イメージは出席番号データを
String[] numData = {01, 03, 04, 05, 06, 07,};
上記のようにできたらと考えています。

どなたかご教授いただければ幸いです。よろしくお願いいたします。

該当のソースコード

Java

1 // ファイルを読み込みモードでオープンする 2 MyFileReader mfr1 = new MyFileReader(numFile); 3 MyFileReader mfr2 = new MyFileReader(saitenFile); 4 5 // 出席番号ファイルを読み込み、出力対象コードを出力 6 String read; 7 String[] numData = {}; 8 9 while((read = mfr1.read()) != null) { 10 numData = read.split("\n"); 11 } //この部分でつまづいています。 12 13 14 // 採点ファイルを1行ずつ読み込み、ファイルに出力する 15 String line; 16 String[] saitenData = {}; 17 18 while((line = mfr2.read()) != null) { 19 saitenData = line.split(" "); 20 21 // 先頭文字が出力対象かチェックするための繰り返し 22 for(int i = 0; i < numData.length; i++) { 23 24 int num = 0; 25 String name = ""; 26 int eigo = 0; 27 int suugaku = 0; 28 int kokugo = 0; 29 30 int sum = 0; 31 int ave = 0; 32 33 // 出席番号データと採点データの出席番号が一致すれば出力する 34 if(saitenData[0].equals (numData[i])) { 35 36 num = Integer.parseInt(saitenData[0]); 37 name = saitenData[1]; 38 eigo = Integer.parseInt(saitenData[2]); 39 suugaku = Integer.parseInt(saitenData[3]); 40 kokugo = Integer.parseInt(saitenData[4]); 41 42 sum = eigo + suugaku + kokugo; 43 ave = sum / 3; 44 45 } 46 47 } 48 49 } 50 51 mfr1.close(); 52 mfr2.close(); 53

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/05/08 18:34

先のご質問[Javaのファイル操作によるグループトータル処理がわかりません] https://teratail.com/questions/337123 の延長なのだと思いますが、そもそも独自のクラスと思われるMyFileReaderのread()メソッドの動作が分かりません。これは1行ごとに読み出すものではないのでしょうか。採点ファイルの読み出し方を見るとそれっぽく見えます。だとするとsplit("\n")を実行する意味はほとんど無いように思います。 前提として、MyFileReaderクラスが何をやっているのか、本質問を読んだ者には想像以上のことは分かりません。
javamurisugiru

2021/05/09 04:10

すみません、表記するのを忘れていました。 MyFileReaderのread()メソッドではおっしゃる通りレコードを一行読み込むという動作を行っています。 わたしの行いたいデータの照合に関して、半角スペース区切りになっている一行のデータと複数行のデータを照合し、データが一致したものだけを取り出すことはできるのですが、複数行のデータと複数行のデータの照合の仕方がわからず、複数行のデータを無理やり配列に代入することはできないかと考え、このような質問に至りました、、。
guest

回答2

0

ArrayList を使えばいいでしょう。

Java

1import java.io.File; 2import java.util.Scanner; 3import java.util.ArrayList; 4 5class MyFileReader { 6 Scanner sc; 7 8 MyFileReader(String fname) throws Exception { 9 sc = new Scanner(new File(fname)); 10 } 11 String read() { return sc.hasNextLine() ? sc.nextLine() : null; } 12 void close() { sc.close(); } 13} 14 15class Main { 16 public static void main(String[] args) throws Exception { 17 String numFile = "num.txt"; 18 String saitenFile = "saiten.txt"; 19 20 // ファイルを読み込みモードでオープンする 21 MyFileReader mfr1 = new MyFileReader(numFile); 22 MyFileReader mfr2 = new MyFileReader(saitenFile); 23 24 // 出席番号ファイルを読み込み、出力対象コードを出力 25 String read; 26 //String[] numData = {}; // ★ 27 ArrayList<String> as = new ArrayList<>(); // ★ 28 29 while((read = mfr1.read()) != null) { 30 as.add(read); // ★ 31 } //この部分でつまづいています。 32 String[] numData = new String[as.size()]; // ★ 33 as.toArray(numData); // ★ 34 35 // 採点ファイルを1行ずつ読み込み、ファイルに出力する 36 String line; 37 String[] saitenData = {}; 38 39 while((line = mfr2.read()) != null) { 40 saitenData = line.split(" "); 41 42 // 先頭文字が出力対象かチェックするための繰り返し 43 for(int i = 0; i < numData.length; i++) { 44 45 int num = 0; 46 String name = ""; 47 int eigo = 0; 48 int suugaku = 0; 49 int kokugo = 0; 50 51 int sum = 0; 52 int ave = 0; 53 54 // 出席番号データと採点データの出席番号が一致すれば出力する 55 if(saitenData[0].equals (numData[i])) { 56 57 num = Integer.parseInt(saitenData[0]); 58 name = saitenData[1]; 59 eigo = Integer.parseInt(saitenData[2]); 60 suugaku = Integer.parseInt(saitenData[3]); 61 kokugo = Integer.parseInt(saitenData[4]); 62 63 sum = eigo + suugaku + kokugo; 64 ave = sum / 3; 65 System.out.format("%2d %-12s %3d %3d %3d %3d %3d%n", 66 num, name, eigo, suugaku, kokugo, sum, ave); // ★ 67 } 68 } 69 } 70 mfr1.close(); 71 mfr2.close(); 72 } 73}

出席番号が昇順なら配列は不要です。

Java

1import java.util.Scanner; 2import java.io.File; 3 4class Main { 5 public static void main(String[] args) throws Exception { 6 Scanner sc1 = new Scanner(new File("num.txt")); 7 Scanner sc2 = new Scanner(new File("saiten.txt")); 8 int num = 0; 9 while (sc2.hasNextLine()) { 10 String line = sc2.nextLine(); 11 Scanner sc3 = new Scanner(line); 12 int id = sc3.nextInt(); 13 while (num < id && sc1.hasNextInt()) num = sc1.nextInt(); 14 if (num < id) break; 15 if (num == id) { 16 String name = sc3.next(); 17 int english = sc3.nextInt(); 18 int math = sc3.nextInt(); 19 int japanese = sc3.nextInt(); 20 int sum = english + math + japanese; 21 int ave = sum / 3; 22 System.out.format("%2d %-12s %3d %3d %3d %3d %3d%n", 23 id, name, english, math, japanese, sum, ave); 24 } 25 sc3.close(); 26 } 27 sc2.close(); 28 sc1.close(); 29 } 30}

投稿2021/05/09 00:41

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「出席番号のデータ数がわからない」という状況ならば、Listを使うなり、十分大きなサイズの配列にいったん入れるなり、いくらでもあります。

投稿2021/05/08 17:13

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問